O problema com
LAST_VALUE()
é que as regras padrão para cláusulas de janela removem os valores que você realmente deseja. Este é um problema muito sutil e é verdadeiro em todos os bancos de dados que suportam essa funcionalidade. Isso vem de um blog da Oracle:
Enquanto estamos no tópico de cláusulas de janela, a cláusula de janela implícita e imutável para as funções FIRST e LAST é ROWSBETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, em outras palavras, todas as linhas em nossa partição. Para FIRST_VALUE e LAST_VALUE, a cláusula de janela padrão, mas alterável, é ROWS BETWEEN UNBOUNDED PRECEDINGAND CURRENT ROW, em outras palavras, excluímos as linhas após a atual. FIRST_VALUE), mas faz diferença quando estamos procurando a última linha na lista (LAST_VALUE) então você geralmente precisará especificar ROWS BETWEENUNBOUNDED PRECEDING E UNBOUNDED FOLLOWING explicitamente ao usarLAST_VALUE ou apenas usar FIRST_VALUE e inverter a ordem de classificação .
Portanto, basta usar
FIRST_VALUE()
. Isso faz o que você quer: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