Berikut kueri cepat untuk mengilustrasikan perilaku tersebut:
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)
Output dari query di atas dapat dilihat di sini (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 |
Hanya sedikit orang yang memikirkan frame implisit yang diterapkan ke fungsi jendela yang mengambil ORDER BY
ayat. Dalam hal ini, windows default ke frame RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. (RANGE tidak persis sama dengan ROWS, tapi itu cerita lain). Pikirkan seperti ini:
- Pada baris dengan
v = 1
bingkai jendela yang dipesan membentangv IN (1)
- Pada baris dengan
v = 2
bingkai jendela yang dipesan membentangv IN (1, 2)
- Pada baris dengan
v = 3
bingkai jendela yang dipesan membentangv IN (1, 2, 3)
- Pada baris dengan
v = 4
bingkai jendela yang dipesan membentangv IN (1, 2, 3, 4)
Jika Anda ingin mencegah perilaku tersebut, Anda memiliki dua opsi:
- Gunakan
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
klausa untuk dipesan fungsi jendela - Tidak menggunakan
ORDER BY
klausa dalam fungsi-fungsi jendela yang memungkinkan untuk menghilangkannya (sebagaiMAX(v) OVER()
)
Detail lebih lanjut dijelaskan di artikel ini tentang LEAD()
, LAG()
, FIRST_VALUE()
dan LAST_VALUE()