如何在各种事件序列中找到第一个开始时间?

时间:2015-12-17 16:47:23

标签: sql sql-server sql-server-2008

我有以下专栏

VehicleIdStatusIdStartTimeComments

数据基本上是对VehicleIdStatusId的一系列更改及其发生的时间和评论。在过去几年中,每辆车都可以出现多次状态。数据跨越了几年,但不是一个巨大的数据集50000行。我们只对每辆车的每次状态变更的日期时间感兴趣。这意味着我有很多车辆和statusid的组合以及顺序看到的第一个开始日期。因此,车辆在两个不同的序列中有StatusId我想要每个序列的最早日期,VehicleIdStatusId。我怎么能得到它?

我创建了一个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的变化

1 个答案:

答案 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;