Pergunta

Este veio ao responder de outro usuário questão (TheSoftwareJedi) ...

Dada a tabela a seguir:

ROW_PRIORITY   COL1     COL2    COL3
0              0.1      100     <NULL>
12             <NULL>   <NULL>  3
24             0.2      <NULL>  <NULL>

e a seguinte consulta:

select  'B' METRIC, ROW_PRIORITY,
        last_value(col1 ignore nulls) over (ORDER BY ROW_PRIORITY) col1,
        last_value(col2 ignore nulls) over (ORDER BY ROW_PRIORITY) col2,
        last_value(col3 ignore nulls) over (ORDER BY ROW_PRIORITY) col3
from    (SELECT * FROM ZTEST);

Eu recebo estes resultados:

METRIC  ROW_PRIORITY    COL1    COL2    COL3
B            0          0.1     100     <NULL>
B           12          0.1     100     3
B           24          0.2     100     3

ESPERADOS:

METRIC  ROW_PRIORITY    COL1    COL2    COL3
B            0          0.2     100     3
B           12          0.2     100     3
B           24          0.2     100     3

A questão é, naturalmente, por que não posso obter 0,2 para cada prioridade linha em col1, etc? LAST_VALUE é suposto para executar a ORDER BY em primeiro lugar e, em seguida, escolher o último valor a partir da partição. No caso da consulta acima, a partição é todo o conjunto de registros por isso gostaria de ver os meus resultados esperados anteriormente.

Alguém pode explicar?

Foi útil?

Solução

quando você incluir um ORDER BY na cláusula Partitioning, você pode incluir uma cláusula de janelas para ser explícito.

Se você quiser que essas LAST_VALUES ser sobre todas as linhas, você deve incluir isso após a sua encomenda por:

linhas entre SEGUINTE ANTERIOR UNBOUNDED E UNBOUNDED

Isso deve resolver sua consulta.

Mais detalhes dos docs:

Se você não especificar uma linha ou uma cláusula RANGE, o tamanho da janela é determinada da seguinte forma:

  • Se uma cláusula ORDER BY é especificado, a janela começa com a primeira linha na partição (UNBOUNDED anterior) e termina com a linha atual (CURRENT ROW).
  • Se uma cláusula ORDER BY não for especificado, a janela começa com a primeira linha na partição (UNBOUNDED anterior) e termina com última linha na partição (seguindo UNBOUNDED).
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top