TSQL Reihenfolge, die in 3 aufeinander folgenden Monaten aufgetreten ist

8

Bitte helfen Sie mir die folgende Abfrage zu generieren. Angenommen, ich habe eine Kunden- und eine Auftragstabelle.

Kundentabelle

%Vor%

Bestell-Tabelle

%Vor%

Ich möchte die Kunden herausfinden, die in drei aufeinander folgenden Monaten bestellt haben. (Abfrage mit SQL Server 2005 und 2008 ist erlaubt).

Die gewünschte Ausgabe ist:

%Vor%     
Gopi 18.09.2010, 21:08
quelle

4 Antworten

7

Bearbeiten: Wurde los oder MAX() OVER (PARTITION BY ...) , da dies die Leistung zu zerstören schien.

%Vor%     
Martin Smith 18.09.2010, 21:49
quelle
4

Hier ist meine Version. Ich habe das wirklich nur als eine Kuriosität dargestellt, um eine andere Art des Nachdenkens über das Problem zu zeigen. Es erwies sich als nützlicher als das, weil es besser als sogar Martin Smiths coole "gruppierte Inseln" -Lösung war. Nachdem er jedoch einige überteuerte Aggregat-Fensterfunktionen losgeworden war und statt dessen echte Aggregate verwendet hatte, begann seine Anfrage, auf den Hintern zu treten.

Lösung 1: Läuft über 3 Monate oder länger, indem Sie 1 Monat vor und nach dem Server überprüfen und einen Semi-Join verwenden.

%Vor%

Lösung 2: Exakte 3-Monats-Muster. Wenn es sich um einen 4-Monatslauf oder länger handelt, werden die Werte ausgeschlossen. Dies geschieht, indem man 2 Monate im Voraus und 2 Monate im Nachhinein überprüft (im Wesentlichen nach dem Muster N, Y, Y, Y, N suchend).

%Vor%

Hier ist mein Tabellenlade-Skript, wenn jemand anderes spielen möchte:

%Vor%

Leistung

Hier sind einige Leistungstestergebnisse für die 3-Monats-oder mehr Abfragen:

%Vor%

Dies ist jeweils nur ein Lauf, aber die Zahlen sind ziemlich repräsentativ. Es stellt sich heraus, dass Ihre Anfrage schließlich nicht so schlecht war, Denis. Martins Anfrage schlägt die anderen Hände über den Haufen, aber zuerst verwendete er einige übertrieben teure Fensterfunktionen, die er reparierte.

Natürlich, wie ich bemerkt habe, zieht die Anfrage von Denis nicht die richtigen Zeilen, wenn ein Kunde am selben Tag zwei Aufträge hat, also ist seine Anfrage außer Konkurrenz, es sei denn, er hat es behoben.

Auch verschiedene Indizes könnten möglicherweise die Dinge aufmischen. Ich weiß es nicht.

    
ErikE 20.09.2010 20:13
quelle
1

Hier geht's:

%Vor%     
Denis Valeev 18.09.2010 21:59
quelle
0

Hier ist meine Einstellung.

%Vor%     
hengrr 15.04.2016 18:59
quelle