SQL: Last_Value () liefert falsches Ergebnis (aber First_Value () funktioniert einwandfrei)

8

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 ....

    
Echo 13.03.2013, 15:01
quelle

3 Antworten

9

Es ist nichts falsch mit Ihrem Skript, das ist ein Weg, wie Partitionierung in SQL Server funktioniert: /. Wenn Sie LAST_VALUE in MAX ändern, wird das Ergebnis gleich sein. Lösung wäre:

%Vor%

Es gibt einen tollen Post darüber, Link . GL!

    
www 13.03.2013, 15:53
quelle
14

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:

  • In der Zeile mit v = 1 erstreckt sich der Rahmen des geordneten Fensters über v IN (1)
  • In der Zeile mit v = 2 erstreckt sich der Rahmen des geordneten Fensters über v IN (1, 2)
  • In der Zeile mit v = 3 erstreckt sich der Rahmen des geordneten Fensters über v IN (1, 2, 3)
  • In der Zeile mit 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:

  • Verwenden Sie eine explizite ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING -Klausel für geordnete Fensterfunktionen
  • Verwenden Sie in diesen Fensterfunktionen keine 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()

    
Lukas Eder 07.11.2014 17:09
quelle
0

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%     
Vishnu Kumar 24.04.2017 09:37
quelle