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,请稍后再试。是否应该为此返回一条记录,从第一次记录到最后一次,创建一个连续的序列?是的,应该有该时间的数据-但它可能尚未传递到服务器。