PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Funções da janela:last_value(ORDER BY ... ASC) igual a last_value(ORDER BY ... DESC)


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