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

Наслаждаться,

Ноэль

Другие вопросы по тегам