SQL Server 2008 R2: представление данных о поездке другим способом
У меня есть некоторые данные о поездке, которые я хочу выделить следующим образом.
Вот данные как
NodeId dNodeid StartTripUTC EndTripUTC TripDistance
3737 3738 2016-04-11 12:45:44.000 2016-04-11 13:47:57.000 9987
3737 3738 2016-04-11 12:54:00.000 2016-04-11 13:12:00.000 NULL
3737 3738 2016-04-11 13:22:00.000 2016-04-11 13:42:00.000 NULL
Строка (и), в которой TripDistance равен NULL, являются, если хотите, суб-отключениями полного отключения, которое отображается в виде строки, в которой TripDistance НЕ НЕДЕЙСТВИТЕЛЕН.
Я хочу представить это так
NodeId dNodeid StartTripUTC EndTripUTC TripDistance
3737 3738 2016-04-11 12:45:44.000 2016-04-11 12:54:00.000 9987
3737 3738 2016-04-11 13:12:00.000 2016-04-11 13:22:00.000 NULL
3737 3738 2016-04-11 13:42:00.000 2016-04-11 13:47:57.000 NULL
Таким образом, "EndTripUTC" из первого ряда становится "EndTripUTC" последнего ряда. "StartTripUTC" из строки 2 становится "EndTripUTC" первой строки. И так далее.
Ваша помощь очень ценится.
Вот некоторые примеры данных.
IF OBJECT_ID('tempdb..#BreakdownTrips') IS NOT NULL
DROP TABLE #BreakdownTrips
CREATE TABLE #BreakdownTrips(
NodeId INT
,dNodeid INT
,StartTripUTC DATETIME
,EndTripUTC DATETIME
,TripDistance INT
)
INSERT INTO #BreakdownTrips(
NodeId
,dNodeid
,StartTripUTC
,EndTripUTC
,TripDistance
)
VALUES
( 3737,3738,'2016-04-11 12:45:44.000','2016-04-11 13:47:57.000',9987 )
,( 3737,3738,'2016-04-11 12:54:00.000','2016-04-11 13:12:00.000',NULL )
,( 3737,3738,'2016-04-11 13:22:00.000','2016-04-11 13:42:00.000',NULL )
,( 3999,923,'2016-04-11 10:30:52.000','2016-04-11 10:46:30.000',0 )
,( 3999,923,'2016-04-11 10:30:52.500','2016-04-11 10:46:00.000',NULL )
,( 4006,1010,'2016-04-14 13:36:30.000','2016-04-14 14:25:49.000',39 )
,( 4006,1010,'2016-04-14 13:36:30.000','2016-04-14 14:12:00.000',NULL )
,( 4006,1010,'2016-04-14 14:14:00.000','2016-04-14 14:24:00.000',NULL )
DROP TABLE #BreakdownTrips
1 ответ
Я думаю, что это поможет.
IF OBJECT_ID('tempdb..#BreakdownTripsTemp') IS NOT NULL DROP TABLE #BreakdownTripsTemp
select rownum = row_number() over
(
partition by x.NodeId, x.dNodeid
order by x.NodeId, x.dNodeid, x.TripUTC, x.TripDistance desc
), x.*
into #BreakdownTripsTemp
from
(
select a.NodeId, a.dNodeid, a.StartTripUTC as 'TripUTC', a.TripDistance
from #BreakdownTrips a
union
select a.NodeId, a.dNodeid, a.EndTripUTC as 'TripUTC', NULL
from #BreakdownTrips a
) x
select a.NodeId, a.dNodeid, a.TripUTC as 'StartTripUTC', b.TripUTC as 'EndTripUTC', a.TripDistance
from #BreakdownTripsTemp a
inner join #BreakdownTripsTemp b on a.NodeId = b.NodeId
and a.dNodeid = b.dNodeid
and a.rownum = (b.rownum - 1) -- join odd and even rows
where (a.rownum % 2) = 1 -- get the odd rows
order by a.NodeId, a.dNodeid, a.rownum
По сути, я объединяю все даты в комбинации NodeId и dNodeid, применяю номера строк в разделе NodeId и dNodeid и помещаю результаты в временную таблицу. Чтобы собрать его вместе, я запрашиваю нечетные номера строк из временной таблицы, чтобы получить все данные, кроме EndTripUTC и внутреннего соединения с четными строками временной таблицы, чтобы получить EndTripUTC.
NodeId dNodeid StartTripUTC EndTripUTC TripDistance
----------- ----------- ----------------------- ----------------------- ------------
3737 3738 2016-04-11 12:45:44.000 2016-04-11 12:54:00.000 9987
3737 3738 2016-04-11 13:12:00.000 2016-04-11 13:22:00.000 NULL
3737 3738 2016-04-11 13:42:00.000 2016-04-11 13:47:57.000 NULL
3999 923 2016-04-11 10:30:52.000 2016-04-11 10:30:52.500 0
3999 923 2016-04-11 10:46:00.000 2016-04-11 10:46:30.000 NULL
4006 1010 2016-04-14 13:36:30.000 2016-04-14 13:36:30.000 39
4006 1010 2016-04-14 14:12:00.000 2016-04-14 14:14:00.000 NULL
4006 1010 2016-04-14 14:24:00.000 2016-04-14 14:25:49.000 NULL
Наслаждаться,
Ноэль