2015-01-22 5 views
-1

У меня есть SQL Server 2005 таблица под названием «Journeys» следующим образом:Значения различия между дней

+---------------+ 
| Journeys | 
+---------------+ 
| JourneyID  | 
| PlateNumber | 
| DepartureDate | 
| DepartureKM | 
| ArrivalDate | 
| ArrivalKM  | 
+---------------+ 

В таблице приведены следующие данные выборки:

+------------+--------------+----------------+--------------+--------------+-----------+ 
| JOURNEYID | PLATENUMBER | DEPARTUREDATE | DEPARTUREKM | ARRIVALDATE | ARRIVALKM | 
+------------+--------------+----------------+--------------+--------------+-----------+ 
|   1 | ABC-123  | 01-01-2015  |  10000 | 01-02-2015 |  10200 | 
|   2 | ABC-123  | 01-02-2015  |  10210 | 01-03-2015 |  10500 | 
|   3 | ABC-123  | 01-03-2015  |  10500 | 01-04-2015 |  10650 | 
|   4 | ABC-123  | 01-04-2015  |  10607 | 01-05-2015 |  10900 | 
|   5 | XYZ-999  | 01-15-2015  |  30200 | 01-16-2015 |  30400 | 
|   6 | XYZ-999  | 01-16-2015  |  30405 | 01-17-2015 |  30600 | 
|   7 | XYZ-999  | 01-17-2015  |  30600 | 01-18-2015 |  30750 | 
|   8 | XYZ-999  | 01-18-2015  |  30752 | 01-19-2015 |  30920 | 
+------------+--------------+----------------+--------------+--------------+-----------+ 

Я хочу, чтобы создать запрос, возвращает следующие результаты с дополнительным столбцом с именем «KMDifference», который представляет собой разницу между «ArrivalKM» с последнего дня и «DepartureKM» с сегодняшнего дня.

Желаемые результаты:

+-------------+---------------+-------------+-------------+-----------+--------------+ 
| PlateNumber | DepartureDate | DepartureKM | ArrivalDate | ArrivalKM | KMDifference | 
+-------------+---------------+-------------+-------------+-----------+--------------+ 
| ABC-123  | 01-01-2015 |  10000 | 01-02-2015 |  10200 |   0 | 
| ABC-123  | 01-02-2015 |  10210 | 01-03-2015 |  10500 |   10 | 
| ABC-123  | 01-03-2015 |  10500 | 01-04-2015 |  10650 |   0 | 
| ABC-123  | 01-04-2015 |  10607 | 01-05-2015 |  10900 |   7 | 
| XYZ-999  | 01-15-2015 |  30200 | 01-16-2015 |  30400 |   0 | 
| XYZ-999  | 01-16-2015 |  30405 | 01-17-2015 |  30600 |   5 | 
| XYZ-999  | 01-17-2015 |  30600 | 01-18-2015 |  30750 |   0 | 
| XYZ-999  | 01-18-2015 |  30752 | 01-19-2015 |  30920 |   2 | 
+-------------+---------------+-------------+-------------+-----------+--------------+ 

Смотрите этот SQL скрипку здесь: http://sqlfiddle.com/#!3/28abd

+0

Вы еще что-нибудь пробовали? У вас проблема? http://stackoverflow.com/help/how-to-ask – macoms01

ответ

0

Вы можете использовать следующий CTE запрос, основанный для того, чтобы имитировать LAG функцию, доступную с SQL Server 2012 и далее:

;WITH Journeys_rn AS (
    SELECT JourneyID, PlateNumber, DepartureDate, DepartureKM, ArrivalDate, ArrivalKM, 
      ROW_NUMBER() OVER(PARTITION BY PlateNumber ORDER BY DepartureDate) AS rn 
    FROM Journeys 
) 
SELECT j1.PlateNumber, j1.DepartureDate, j1.DepartureKM, 
     j1.ArrivalDate, j1.ArrivalKM, 
     j1.DepartureKM - ISNULL(j2.ArrivalKM, j1.DepartureKM) AS KMDifference 
FROM Journeys_rn AS j1 
LEFT JOIN Journeys_rn AS j2 ON j1.rn = j2.rn+1 AND j1.PlateNumber = j2.PlateNumber 

j2.ArrivalKM в вышеуказанном запросе - значение от предыдущий запись. ISNULL необходим для вычисления значения 0 для первых записей каждой группы.

SQL Fiddle Demo

P.S. Образцы данных в OP не совпадают с образцами данных источника SQL Fiddle, также предоставленными в OP. Поэтому пришлось исправить это, чтобы получить желаемый результирующий набор.

+0

Спасибо, Гиоргос! – milo2011

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