2017-08-03 2 views
-2

Ich hoffe, dass jemand mich hier in die richtige Richtung zeigen kann. Ich habe eine einzigartige Anforderung in Bezug auf Ranking-Datensätze in einer SQL Server-Tabelle. Die Tabelle sieht so aus ... Status Change TableSQL Server Ranking - Ignorieren doppelte Zeilenwerte

Diese Tabelle zeigt ein Mitglied eines Gesundheitsclubs und ihre verschiedenen Statusänderungen (A = Aktiv, C = Abgebrochen). Ich möchte diese Statusänderungen auf eine einzigartige Weise einstufen. Ich möchte zuerst eine Aufnahme machen, um 1 zu sein und dann die nächsten 3 A-Aufzeichnungen ignorieren. Der erste C-Datensatz würde dann ebenfalls auf Platz 1 gesetzt werden und der folgende A-Datensatz würde den Rang 2 haben. Wiederum möchte ich die folgenden 3 A-Datensätze vor dem nächsten C-Datensatz ignorieren.

Sie wundern sich wahrscheinlich, warum wir mehrere gleiche Status in einer Reihe mit neuen Zeiträumen von/nach sehen. Dies ist b/c, dies kam von einem größeren Datensatz, wo andere Spalten tatsächlich geändert wurden, während die Zustände gleich blieben. Mein Endziel besteht darin, nur die relevanten (geordneten) Zeilen vorzuschieben und die aktiven/abgebrochenen Zeilen basierend auf dem Rang zusammenzufassen. Dann würde ich eine völlig neue Tabelle/Abfrage erstellen, um neue From/To-Daten für die verschiedenen Perioden zu erstellen.

Danke für jede Beratung angeboten !!

Antwort

0

Ist das, was Sie suchen?

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

Ich muss diesen Code mit mir testen, um zu sehen, ob es funktioniert, wird zurück zu Ihnen ... – Dan

0

Danke für die Eingabe Jungs. Ich habe eine Lösung gefunden, die für mich funktioniert hat. Dazu wird zunächst die Funktion LAG() in der Statusspalte verwendet. Von dort habe ich ein "RankingFlag" -Feld erstellt. Der Flag-Wert wäre 1, wenn der Status für die aktuelle Zeile NULL ODER < => zum LAG-Status (vorherige Zeile) lautet. Als nächstes habe ich nur einen Rang auf all diesen RangingFlag = 1 Feldern mit einer Partition nach Status durchgeführt.

Verwandte Themen