Gruppieren Sie Daten nach der Änderung des Gruppierungsspaltenwerts in der Reihenfolge

8

Mit den folgenden Daten

%Vor%

Ich möchte die folgende Ausgabe erzeugen:

%Vor%

Wenn ich nach Preis gruppiere und das maximale und minimale Datum zeige, werde ich folgendes bekommen, was nicht das ist, was ich möchte (siehe das Überlappen von Daten).

%Vor%

Also im Wesentlichen, was ich suche zu tun ist gruppieren durch den Schritt Änderung in Daten basierend auf Gruppenspalten Produkt und Preis.

Was ist der sauberste Weg, dies zu erreichen?

    
MrEdmundo 11.04.2012, 16:26
quelle

4 Antworten

18

Es gibt eine (mehr oder weniger) bekannte Technik, um diese Art von Problem zu lösen, mit zwei ROW_NUMBER() ruft wie folgt auf:

%Vor%

Ausgabe:

%Vor%     
Andriy M 28.04.2012, 19:53
quelle
2

Ich bin neu in diesem Forum, also hoffe mein Beitrag ist hilfreich.

Wenn Sie wirklich kein CTE verwenden möchten (obwohl ich denke, dass dies wahrscheinlich der beste Ansatz ist), können Sie eine Lösung mit Set-based Code erhalten. Sie müssen die Leistung dieses Codes testen!.

Ich habe eine extra temporäre Tabelle hinzugefügt, so dass ich eine eindeutige ID für jeden Datensatz verwenden kann, aber ich vermute, dass Sie diese Spalte bereits in Ihrer Quellentabelle haben. Das ist die Temp-Tabelle.

%Vor%

Jetzt der Hauptteil der Select-Anweisung

%Vor%

Durch die Bindung der Datenquelle um 1 Datensatz (+ oder -) können wir feststellen, wann sich die Preis-Buckets ändern, und dann ist es nur noch eine Frage, das Start- und Enddatum für die Buckets in einen einzelnen Datensatz zurückzuversetzen.

Alles ein bisschen fummelig und ich bin mir nicht sicher, ob es bessere Leistung bringen wird, aber ich habe die Herausforderung genossen.

    
redsevi 28.04.2012 18:16
quelle
0

Eine Lösung, die ich gefunden habe, ist relativ "sauber" ist:

%Vor%

Ich habe ein CTE mit row_number verwendet, weil Sie sich dann keine Gedanken darüber machen müssen, ob Daten fehlen, wenn Sie Funktionen wie dateadd verwenden. Sie brauchen offensichtlich nur die äußere Anwendung, wenn Sie die date_to-Spalte haben wollen (was ich tue).

Diese Lösung löst mein Problem, aber ich habe ein kleines Problem damit, es so schnell auszuführen, wie ich es auf meinem Tisch mit 5 Millionen Zeilen möchte.

    
MrEdmundo 12.04.2012 07:56
quelle
-1
%Vor%     
Jean Paul Nasab 01.10.2013 00:31
quelle