2016-01-07 5 views
0

Я использую MS SQL и нуждаюсь в некотором совете о том, как построить запрос. По сути, у меня есть файл транзакций с топливом (прокрутка кредитной карты), и в нем фиксируется текущее показание одометра. Я пытаюсь построить запрос с использованием номера транспортного средства (уникальный идентификатор для транспортного средства), даты транзакции и текущего показания одометра для расчета нового столбца, который смотрит на данную топливную транзакцию, находит предыдущую транзакцию (на основе даты транзакции) для этой транзакции транспортного средства, а затем вычисляет мили, которые были перемещены между двумя точками данных.Вычисление разницы значений между транзакциями и предшествующей транзакцией

Я боюсь идентифицировать предыдущую транзакцию. Любая помощь будет оценена, чтобы помочь мне начать работу. Я не ищу конкретный скрипт, но просто какой-то псевдо-код помог бы мне уйти.

Если вы хотите уточнить, вот ключевые столбцы. CompanyVehicleNumber, TransactionDate (формат YYYYMMDD), TransactionTime (формат HHMMSS), Одометр (например, 123456)

Спасибо.

+0

создать sqlfiddle ............. –

+0

Что тип данных для 'TransactionDate' и' TransactionTime'? –

+0

Ах, забыл упомянуть об этом. Все упомянутые поля являются строками (nvarchar) –

ответ

0

Вы можете использовать APPLY получить предыдущую сделку:

SELECT 
    t.*, MilesDiff = t.odometer - x.odometer 
FROM tbl t 
OUTER APPLY(
    SELECT TOP 1 odometer 
    FROM tbl 
    WHERE 
     CompanyVehicleNumber = t.CompanyVehicleNumber 
     AND (TransactionDate + TransactionTime) < (t.TransactionDate + t.TransactionTime) 
    ORDER BY (TransactionDate + TransactionTime) DESC 
) x(odometer) 

Отметим здесь, что вам нужно преобразовать TransactionDate и TransactionTime к DATETIME, чтобы иметь возможность сравнить сделки.


Вот один способ преобразования даты и времени:

DECLARE @date VARCHAR(8) = '20130101' 
DECLARE @time VARCHAR(6) = '053000' 

SELECT 
    CAST(@date AS DATETIME) + 
    CAST(LEFT(@time, 2) + ':' + SUBSTRING(@time, 3, 2) + ':' + RIGHT(@time, 2) AS DATETIME) 
+0

Удивительный, это то, что я искал, но не мог собрать его в голове. Был долгий день. Я должен быть в состоянии добраться туда с этой отправной точкой. Я отвечу, если у меня возникнут какие-либо проблемы. Спасибо за помощь. –

+0

Я добавил 'DESC' в' ORDER BY'. –

Смежные вопросы