我有以下专栏
VehicleId
,StatusId
,StartTime
,Comments
数据基本上是对的一系列更改VehicleId
,StatusId
包括它们发生的时间和注释。在过去的几年中,每辆车都可能多次出现状态ID。数据跨度为数年,但不是5万行的巨大数据集。我们只对每种车辆的每种状态更改的日期时间感兴趣。因此,这意味着我有很多车辆和状态ID的组合,并且依次看到了第一个开始日期。因此,车辆StatusId
在两个不同的序列中都有a ,我想要每个序列的最早日期theVehicleId
和that StatusId
。我该怎么办?
我在这里创建了一个SQL小提琴
我看了看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的更改
您可以使用不同的行号方法来识别组。然后聚合得到您想要的:
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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句