2015-12-17 19 views
3

我有以下幾列如何在各種事件序列中找到第一個開始時間?

VehicleIdStatusIdStartTimeComments

的數據基本上是變化的序列VehicleIdStatusId與它們發生的時間和評論。在過去的幾年裏,每輛車都可能有多次出現狀態。數據跨越了數年,但不是50000行的龐大數據集。我們只對每個車輛每次更換狀態的日期時間感興趣。所以這就意味着我有很多車輛和狀態ID的組合,並且依次看到第一個開始日期。所以車輛有兩個不同序列的StatusId我想要每個序列的最早日期,VehicleIdStatusId。我怎麼弄到的?

我創建了一個SQL小提琴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 

所以我基本上需要將輸出行減少到只有啓動o f每個序列加入行的任何更改,除非它是VehicileId或StatusId的更改

回答

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; 
+0

很好 - 正是我所需要的。行號差異的方法不是我以前見過的!將不得不做一些閱讀。 – GraemeMiller

相關問題