我有以下专栏
VehicleId
,StatusId
,StartTime
,Comments
数据基本上是对VehicleId
,StatusId
的一系列更改及其发生的时间和评论。在过去几年中,每辆车都可以出现多次状态。数据跨越了几年,但不是一个巨大的数据集50000行。我们只对每辆车的每次状态变更的日期时间感兴趣。这意味着我有很多车辆和statusid的组合以及顺序看到的第一个开始日期。因此,车辆在两个不同的序列中有StatusId
我想要每个序列的最早日期,VehicleId
和StatusId
。我怎么能得到它?
我创建了一个sql fiddle here
我看了RANK() OVER (PARTITION BY [VehicleId],[StatusID] ORDER BY StartTime) AS [Group]
等,但他们似乎没有帮助
输入
VehicleId | StatusId | StartTime
1 | 1 | 2010-1-1
1 | 1 | 2010-1-2
1 | 2 | 2010-1-3
1 | 2 | 2010-1-4
1 | 1 | 2010-1-5
2 | 1 | 2010-1-2
输出
VehicleId | StatusId | FirstStartTime
1 | 1 | 2010-1-1
1 | 2 | 2010-1-3
1 | 1 | 2010-1-5
2 | 1 | 2010-1-2
所以我基本上需要减少输出行,只让每个序列的开头加入对行的任何更改,除非它是VehcileId或StatusId的变化
答案 0 :(得分:3)
您可以使用行号方法的差异来识别组。然后聚合得到你想要的东西:
select vehicleId, statusId, min(StartTime) as FirstStartTime
from (select se.*,
(row_number() over (partition by vehicleId order by StartTime) -
row_number() over (partition by vehicleId, StatusId order by StartTime)
) as grp
from StatusEvents se
) se
group by grp, statusId, vehicleId
order by vehicleId, FirstStartTime;