2016-01-11 23 views
-1

值的表像這樣SQL服務器:我們會根據持續時間繼續我有一個列

ID   VehicleID    Time    EngineStatus 
--   ----------  ------------------  ---------------- 
0    0001   1/11/2016 00:00    off 
0    0002   1/11/2016 00:10    off 
0    0003   1/11/2016 00:10    off 
0    0001   1/11/2016 00:10    ON 
0    0001   1/11/2016 00:11    ON 
0    0003   1/11/2016 00:20    off 
0    0002   1/11/2016 00:15    off 
0    0001   1/11/2016 00:11    off 
0    0001   1/11/2016 00:12    off 
0    0001   1/11/2016 00:20    ON 
0    0001   1/11/2016 00:25    ON 

我想每一輛汽車,它的持續時間EngineStatus。 我需要一個查詢導致這樣

 Start    End     Status  VehileID 
--------------- --------------   --------  ---------- 
1/11/2016 00:00 1/11/2016 00:10   OFF   0001 
1/11/2016 00:10 1/11/2016 00:11   ON    0001 
1/11/2016 00:11 1/11/2016 00:12   Off   0001 
1/11/2016 00:20 1/11/2016 00:25   ON    0001 

1/11/2016 00:10 1/11/2016 00:15   OFF   0002 

1/11/2016 00:10 1/11/2016 00:20   OFF   0003 

我想,不知何故,我必須組基於數據繼續列的值,然後從各組獲得第一和最後一排。

+0

您能否包含您正在使用的SQL Server版本? 2012及更高版本,包括其他選項在早期版本中不可用。 –

+1

我*認爲*你的問題已被低估,因爲它沒有包括你到目前爲止嘗試過的例子(但很難說,因爲downvoters沒有包括評論)。 –

+0

這是SQL服務器2008R2 謝謝你的時間提前 –

回答

0

像這樣的東西應該工作:

SELECT MIN([Time]) AS [Start], MAX([Time]) AS [End], 
     EngineStatus, VehicleID 
FROM (
    SELECT VehicleID, [Time], EngineStatus, 
     ROW_NUMBER() OVER (PARTITION BY VehicleID ORDER BY [Time]) - 
     ROW_NUMBER() OVER (PARTITION BY VehicleID, EngineStatus 
          ORDER BY [Time]) AS grp 
    FROM mytable) AS t 
GROUP BY VehicleID, EngineStatus, grp 

grp標識連續記錄具有相同VehicleID, EngineStatus值切片。

0

嘗試;

;with data_tbl as (
    select 
     [VehicleID], 
     [Time], 
     [EngineStatus], 
     dense_rank() over(partition by [VehicleID] order by [VehicleID], [Time]) rnk 
    from tbl  
) 
select 
    t1.[Time] Start, 
    t2.[Time] End, 
    t1.[EngineStatus] Status, 
    t1.[VehicleID] VehileID 
from data_tbl t1 
join data_tbl t2 
on t1.[VehicleID] = t2.VehicleID 
and t1.rnk = t2.rnk - 1 
and t1.[EngineStatus] = t2.[EngineStatus] 
order by t1.[VehicleID], t1.[Time]