Ich habe eine gespeicherte Prozedur (MS SQL Server 2008 R2), die prüfen muss, ob 10 Punkte / Verkäufe innerhalb eines 30-Tage-Rolling-Fensters liegen. Bisher habe ich eine Lösung, die funktioniert, aber es ist keine "richtige" Lösung, da sie nicht satzbasiert ist. Ich benutze while-Schleifen, um zu verarbeiten, was los ist. Wenn ich mir die Punkte eines Agenten ansehe, nehme ich das Datum des ersten Punkts und sehe, ob 9 weitere innerhalb eines 30-Tage-Fensters liegen. Wenn ja, markiere ich sie als verarbeitet und verwendet und fahre mit dem nächsten fort. Ich denke, es muss eine "bessere" Lösung geben, die satzbasiert ist.
Um zu sehen, was ich habe, habe ich eine SQL-Geige eingerichtet. Es zeigt am Ende, dass wir 3 Agenten verarbeitet haben und 4 Anreize gegeben werden müssen. Gibt es eine bessere Möglichkeit, dies zu tun, ohne while-Schleifen zu verwenden, die mehr auf Sätzen basieren?
quelle
Antworten:
Ich habe versucht, einen Ansatz zu entwickeln, der 2008 funktioniert und mehr auf Sets basiert. Folgendes habe ich mir ausgedacht.
Es war zwar komplexer als ich gehofft hatte, aber es könnte ein interessanter Ansatz für Sie sein, einen Vergleich mit Ihrem aktuellen Ansatz für größere Datenmengen anzustellen. Für das, was es wert ist, läuft dieses Skript in ungefähr 15 ms für den bereitgestellten Datensatz auf meinem Computer (gegenüber 75 ms für das ursprüngliche Skript).
Wie andere bereits erwähnt haben, gibt es wahrscheinlich andere bessere Ansätze, wenn Sie 2012+ Fensterfunktionen oder 2014 eine nativ kompilierte Prozedur verwenden konnten. Aber es kann Spaß machen, manchmal darüber nachzudenken, wie man Dinge ohne die neueren Funktionen macht!
http://sqlfiddle.com/#!3/ad2be/7
quelle