2017-08-03 73 views
-2

我希望有人能指出我在這裏正確的方向。對於在SQL Server表中排列記錄方面,我有一個獨特的要求。表看起來像這樣... Status Change TableSQL Server排名 - 忽略重複行值

此表顯示健康俱樂部的成員及其各種狀態更改(A =活動,C =取消)。我想以獨特的方式對這些狀態變化進行排名。我想先記錄爲1,然後忽略接下來的3條記錄。第一個C記錄也會被排名爲1,而下面的A記錄的排名爲2.同樣,我想在下一個C記錄之前忽略下面的3個A記錄。

您可能想知道爲什麼我們在連續看到多個與新/來自時間段相同的狀態。這是來自大型數據集的B/C,其中其他列實際發生了更改,而狀態保持不變。我的最終目標是僅提出相關(排名)行並根據排名匹配活動/取消行。然後,我將創建一個全新的表/查詢來爲不同時期建立新的From/To日期。

感謝您提供的任何建議!

回答

0

這是你在找什麼?

WITH 
    cte1 AS (
     SELECT 
      td.memid, td.DateFrom, td.DateTo, td.Status, 
      R1 = ROW_NUMBER() OVER (ORDER BY td.DateFrom), 
      R2 = ROW_NUMBER() OVER (PARTITION BY td.Status ORDER BY td.DateFrom) 
     FROM 
      #TestData td 
     ), 
    cte2 AS (
     SELECT 
      c1.memid, c1.DateFrom, td.DateTo, c1.Status, c1.R1, 
      R3 = ROW_NUMBER() OVER (PARTITION BY c1.R1 - c1.R2 ORDER BY c1.R1) 
     FROM 
      cte1 c1 
     ) 
SELECT 
    c2.memid, c2.DateFrom, td.DateTo, c2.Status, 
    DENSE_RANK() OVER (ORDER BY c2.R1 - c2.R3) 
FROM 
    cte2 c2; 
+0

我需要測試這個代碼與我的,看看它的工作原理,會回來給你... – Dan

0

感謝您的投入。我想出了一個適合我的解決方案。它首先涉及在狀態列上使用LAG()函數。從那裏,我創建了一個「RankingFlag」字段。如果當前行的狀態爲NULL或者< => LAG狀態(前一行),則標誌值爲1。接下來,我只用狀態分區對所有RankingFlag = 1字段執行排名。