LAST_VALUE()
の問題 ウィンドウ句のデフォルトのルールは、本当に必要な値を削除するということです。これは非常に微妙な問題であり、この機能をサポートするすべてのデータベースに当てはまります。
これはOracleブログからのものです:
ウィンドウ句のトピックに取り組んでいる間、FIRST関数とLAST関数の暗黙的で変更不可能なウィンドウ句は、UNDOUNDEDPRECEDINGとUNBOUNDEDFOLLOWINGの間、つまりパーティション内のすべての行です。 FIRST_VALUEとLAST_VALUEの場合、デフォルトで変更可能なウィンドウ句はROWS BETWEEN UNBOUNDED PRECEDINGAND CURRENT ROWです。つまり、現在の行の後の行を除外します。リストの最初の行を探しているときに、リストの一番下から行を削除しても違いはありません( FIRST_VALUE)ただし、リストの最後の行を検索する場合は違いがあります(LAST_VALUE)通常、LAST_VALUEを使用する場合は、ROWS BETWEENUNBOUNDEDPRECEDINGとUNBOUNDEDFOLLOWINGを明示的に指定するか、FIRST_VALUEを使用して並べ替え順序を逆にする必要があります。 。
したがって、FIRST_VALUE()
を使用するだけです。 。これはあなたが望むことをします:
with test (id, session_ID, value) as (
(VALUES (0, 2, 100),
(1, 2, 120),
(2, 2, 140),
(3, 1, 900),
(4, 1, 800),
(5, 1, 500)
)
)
select id,
first_value(value) over (partition by session_ID order by id) as first_value_window,
first_value(value) over (partition by session_ID order by id desc) as first_value_window_desc
from test
order by id