2016-03-24 7 views
2

Ich versuche, eine komplexe SQL-Insert zu erstellen, und ich bin nicht sicher, die richtigen Schlagworte in der Überschrift zu finden.Einfügen mit komplexen geordneten Gruppenzähler

Ok hier einige Daten, mein Problem expain:

Date  Type 
20160321 entry 
20160322 entry 
20160324 entry 
20160325 delete 
20160424 entry 
20160425 entry 
20160428 update 
20160504 update 
20160520 update 
20160520 entry 

Jetzt mag ich Gruppen erstellen, indem jede Änderung der „Art“ in der Reihenfolge des Datums ... so dass die folgende Tabelle am Ende würde existiert:

Date  Type Group 
20160321 entry 1 
20160322 entry 1 
20160324 entry 1 
20160325 delete 2 
20160424 entry 3 
20160425 entry 3 
20160428 update 4 
20160504 update 4 
20160520 update 4 
20160520 entry 5 

ich ... viele Dinge ausprobiert mit LEAD, LAG, FIRST_VALUE und spätere Updates mit row_number ... aber nothings für diese Lösung funktioniert ... Mein Problem ist, dass die Gruppen aren‘ t definierbar durch die Daten selbst ... entstehen die Gruppen in Kombination der Ordnung r und der Wert vor ...

Ich hoffe, Sie verstehen mein Problem und können mir helfen!

+0

Warum wurde der Aktualisierungstyp 4 zugewiesen? – TheGameiswar

Antwort

3

Sie können die folgende Abfrage verwenden:

SELECT [Date], [Type], 
     DENSE_RANK() OVER (ORDER BY min_Date) AS [Group] 
FROM(
    SELECT [Date], [Type], 
     MIN([Date]) OVER (PARTITION BY [Type], grp) AS min_Date 
    FROM ( 
    SELECT [Date], [Type], 
     ROW_NUMBER() OVER (ORDER BY [Date]) - 
     ROW_NUMBER() OVER (PARTITION BY [Type] ORDER BY [Date]) AS grp 
    FROM mytable) AS t) AS s 
ORDER BY [Date] 

Erläuterung:

Die innerste Abfrage:

SELECT [Date], [Type], 
     ROW_NUMBER() OVER (ORDER BY [Date]) - 
     ROW_NUMBER() OVER (PARTITION BY [Type] ORDER BY [Date]) AS grp 
FROM mytable 

erkennt Inseln aufeinanderfolgender Datensätze, die die gleiche Type Wert teilen:

Date  Type grp 
======================== 
20160321 entry 0 
20160322 entry 0 
20160324 entry 0 
20160325 delete 3 
20160424 entry 1 
20160425 entry 1 
20160428 update 6 
20160504 update 6 
20160520 update 6 
20160520 entry 4 

Die zweite Ebene Abfrage verwendet MIN() OVER(), um den minimalen Date Wert jeder Type Scheibe zu berechnen:

Date  Type min_Date 
============================ 
20160321 entry 20160321 
20160322 entry 20160321 
20160324 entry 20160321 
20160325 delete 20160325 
20160424 entry 20160424 
20160425 entry 20160424 
20160428 update 20160428 
20160504 update 20160428 
20160520 update 20160428 
20160520 entry 20160520 

Der Group Wert kann nun leicht durch DENSE_RANK über die Anwendung berechnet werden, min_Date Feld.

+0

Vielen Dank für Ihre schnelle, großartige und vollständige Antwort! Ich dachte, ich wäre nicht so schlecht in SQL, aber ich war nicht in der Lage, eine Lösung zu finden! Sie sparen viel Zeit meines Lebens. Vielen Dank! –

Verwandte Themen