Ich habe eine Tabelle in SQL Server 2012, wie der Snapshot zeigt:
Dann benutze ich Last_Value () und First Value, um AverageAmount von jeder EmpID für verschiedene YearMonth zu erhalten. Das Skript ist wie folgt:
%Vor%Das Ergebnis für diese Abfrage lautet jedoch:
In Spalte von "201112AvgAmount" zeigt es unterschiedliche Werte für jede EmpID an, während "200901AvgAmount" korrekte Werte hat.
Stimmt etwas mit meinem SQL-Skript nicht? Ich habe viel online recherchiert, kann aber immer noch keine Antwort finden ....
Hier ist eine kurze Abfrage, um das Verhalten zu veranschaulichen:
%Vor%Die Ausgabe der obigen Abfrage kann hier eingesehen werden ( SQLFiddle hier ):
%Vor% Nur wenige Leute denken an die impliziten Frames, die auf Fensterfunktionen angewendet werden, die eine ORDER BY
-Klausel verwenden. In diesem Fall sind Fenster standardmäßig auf den Rahmen RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
eingestellt. (RANGE ist nicht genau dasselbe wie ROWS, aber das ist eine andere Geschichte). Denken Sie darüber nach:
v = 1
erstreckt sich der Rahmen des geordneten Fensters über v IN (1)
v = 2
erstreckt sich der Rahmen des geordneten Fensters über v IN (1, 2)
v = 3
erstreckt sich der Rahmen des geordneten Fensters über v IN (1, 2, 3)
v = 4
erstreckt sich der Rahmen des geordneten Fensters über v IN (1, 2, 3, 4)
Wenn Sie dieses Verhalten verhindern möchten, haben Sie zwei Möglichkeiten:
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
-Klausel für geordnete Fensterfunktionen ORDER BY
-Klausel, die es erlauben, sie wegzulassen (als MAX(v) OVER()
) Weitere Details sind in Dieser Artikel über LEAD()
, LAG()
, FIRST_VALUE()
und LAST_VALUE()
Am einfachsten ist es, die Abfrage mit first_value zu wiederholen, indem Sie die Reihenfolge asc für den ersten Fall und desc für den zweiten Fall eingeben.
%Vor%Tags und Links sql sql-server sql-server-2012 sql-function