動作を説明する簡単なクエリを次に示します。
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)
上記のクエリの出力は、ここ (SQLFiddle ここ ) で確認できます。 ):
<プレ>| 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 |
ORDER BY
を取るウィンドウ関数に適用される暗黙的なフレームについて考える人はほとんどいません。 句。この場合、ウィンドウはフレーム RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
にデフォルト設定されます . (RANGE は ROWS とまったく同じではありませんが、それは別の話です)。このように考えてみてください:
v = 1
の行 順序付けられたウィンドウのフレームがv IN (1)
にまたがるv = 2
の行 順序付けられたウィンドウのフレーム範囲v IN (1, 2)
v = 3
の行 順序付けられたウィンドウのフレーム範囲はv IN (1, 2, 3)
ですv = 4
の行 順序付けられたウィンドウのフレーム範囲はv IN (1, 2, 3, 4)
です
その動作を防止したい場合は、次の 2 つのオプションがあります:
- 明示的な
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
を使用する ordered の句 ウィンドウ関数 ORDER BY
を使用しない それらを省略できるウィンドウ関数の句 (MAX(v) OVER()
として) )
詳細は LEAD()
に関するこの記事 、 LAG()
, FIRST_VALUE()
および LAST_VALUE()