2016-04-25 12 views
0

私は、以下のように特定の方法で分割したいいくつかの旅行データを持っています。 TripDistanceがNULLである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でない行として示されている完全な旅の、サブツアーです。

私はそう

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」になります。 行2の "StartTripUTC"は、最初の行の "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を取得するために、tempテーブルの奇数行番号を照会し、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 

お楽しみください、

ノエル素晴らしいことだ

+0

。ありがとうございました –

関連する問題