Sql server SQL Server:基于列的连续值获取持续时间

Sql server SQL Server:基于列的连续值获取持续时间,sql-server,sql-server-2008-r2,group-by,data-partitioning,Sql Server,Sql Server 2008 R2,Group By,Data Partitioning,我有一张这样的桌子 ID VehicleID Time EngineStatus -- ---------- ------------------ ---------------- 0 0001 1/11/2016 00:00 off 0 0002 1/11/2016 00:1

我有一张这样的桌子

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
我想得到每辆车的引擎状态和持续时间。 我需要一个这样的查询结果

     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

我想我必须根据列的连续值对数据进行分组,然后从每组中获取第一行和最后一行。

类似的方法应该可以:

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
值的连续记录片段。

Try

;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]

能否包括您正在使用的SQL Server版本?2012年及更高版本,包括早期版本中没有的其他选项。我认为您的问题被否决了,因为它没有包括您迄今为止尝试过的示例(但很难说,因为否决者没有包括评论)。这是SQL server 2008R2。感谢您提前抽出时间。在您的示例中,如果车辆0001从00:12关闭到00:20,请稍后再试。是否应该为此返回一条记录,从第一次记录到最后一次,创建一个连续的序列?是的,应该有该时间的数据-但它可能尚未传递到服务器。