Hier ist eine schnelle Abfrage, das Verhalten zu veranschaulichen:
select
v,
-- FIRST_VALUE() and LAST_VALUE()
first_value(v) over(order by v) f1,
first_value(v) over(order by v rows between unbounded preceding and current row) f2,
first_value(v) over(order by v rows between unbounded preceding and unbounded following) f3,
last_value (v) over(order by v) l1,
last_value (v) over(order by v rows between unbounded preceding and current row) l2,
last_value (v) over(order by v rows between unbounded preceding and unbounded following) l3,
-- For completeness' sake, let's also compare the above with MAX()
max (v) over() m1,
max (v) over(order by v) m2,
max (v) over(order by v rows between unbounded preceding and current row) m3,
max (v) over(order by v rows between unbounded preceding and unbounded following) m4
from (values(1),(2),(3),(4)) t(v)
Der Ausgang der obigen Abfrage hier zu sehen ist (SQLFiddle here):
| V | F1 | F2 | F3 | L1 | L2 | L3 | M1 | M2 | M3 | M4 |
|---|----|----|----|----|----|----|----|----|----|----|
| 1 | 1 | 1 | 1 | 1 | 1 | 4 | 4 | 1 | 1 | 4 |
| 2 | 1 | 1 | 1 | 2 | 2 | 4 | 4 | 2 | 2 | 4 |
| 3 | 1 | 1 | 1 | 3 | 3 | 4 | 4 | 3 | 3 | 4 |
| 4 | 1 | 1 | 1 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
Nur wenige Menschen der impliziten Rahmen denken, die angewendet auf Fensterfunktionen, die eine ORDER BY
Klausel annehmen. In diesem Fall sind Fenster standardmäßig auf den Frame RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
eingestellt. (RANGE ist nicht genau dasselbe wie ROWS, aber das ist eine andere Geschichte).Denken Sie an es auf diese Weise:
- Auf der Zeile mit
v = 1
der Rahmen des bestellten Fenster v IN (1)
mit v = 2
- Auf der Reihe erstreckt sich über den Rahmen des bestellten Fenster
v IN (1, 2)
mit v = 3
- Auf der Reihe erstreckt sich über den Rahmen des bestellten Fenster Spannweiten
v IN (1, 2, 3)
- auf die Zeile mit dem Rahmen des
v = 4
geordneten Fensters umspannt v IN (1, 2, 3, 4)
Wenn Sie dieses Verhalten verhindern wollen, haben Sie zwei Möglichkeiten:
- Verwenden Sie eine explizite
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
Klausel für bestellt Fensterfunktionen
- keine
ORDER BY
Klausel in diesen Fensterfunktionen verwenden, die für das Weglassen ihnen ermöglichen (als MAX(v) OVER()
)
Weitere Details sind in this article about LEAD()
, LAG()
, FIRST_VALUE()
and LAST_VALUE()
erklärt
Vielen Dank soooooo viel! Nicht nur das Problem gelöst, sondern auch warum. Ich habe den verlinkten Beitrag schon einmal durchgeblättert, aber nicht über den Partitionierungsmechanismus nachgedacht. – Echo