2017-02-13 49 views
1

我有如下所示的數據集。從這裏,我想選擇每個組的第一行,其中PersonIDs狀態已經改變爲與前一個狀態不同的狀態。如何將這些數據分組而不使用LAG功能

例如,從這個數據集,我想第1,4,7和11行。 對此有什麼幫助? 如果我做一個GROUPBY,它將所有新建和所有待處理的兩個組合在一起。我只有SQL Server 2008,所以滯後功能不起作用。

PersonID Status WhenChanged 
101   New  27/01/2017 15:27 
101   New  27/01/2017 16:40 
101   New  27/01/2017 16:40 
101   Pending 27/01/2017 16:40 
101   Pending 27/01/2017 16:40 
101   Pending 27/01/2017 16:40 
101   New  31/01/2017 09:14 
101   New  31/01/2017 10:02 
101   New  31/01/2017 10:03 
101   New  31/01/2017 10:05 
101   Pending 03/02/2017 14:29 
101   Pending 03/02/2017 14:29 
+0

你的'WhenChanged'嚴重的是'VARCHAR'值...? – Siyual

+1

有了你的結構,這是不可能的。你的日期時間值(可疑地看起來像一個'VARCHAR')*不是唯一的。你沒有什麼可以排序的。沒有任何東西要訂購這些結果,因此沒有保證結果的順序。因此,不可能得到你想要的結果。您需要記錄的唯一ID。 – Siyual

回答

4

您可以用row_numbers()的差異,然後又row_number()做到這一點:

select PersonID, Status, WhenChanged 
from (select t.*, 
      row_number() over (partition by personid, status, seqnum_p - seqnum_ps 
           order by whenchanged 
           ) as seqnum 
     from (select t.*, 
        row_number() over (partition by personid order by whenchanged) as seqnum_p, 
        row_number() over (partition by personid, status order by whenchanged) as seqnum_ps 
      from t 
      ) t 
    ) t 
where seqnum = 1; 

要理解它是如何工作的,我建議你運行子查詢,並查看結果。這些行號之間的差異定義了組。

另一種方法是使用outer apply。但是,以上可能會有更好的表現。

+0

非常感謝戈登,這完美的作品:-) – Tan