Como faço para compactar esse conjunto de resultados do Oracle em valores conformidade com a linha prioritária, ignorando valores nulos?

StackOverflow https://stackoverflow.com/questions/261924

Pergunta

Vou simplificar o problema, tanto quanto possível:

Eu tenho uma tabela Oracle:

row_priority, col1, col2, col3
0, .1, 100, {null}
12, {null}, {null}, 3
24, .2, {null}, {null}

resultado desejado:

col1, col2, col3
.2, 100, 3

Assim, de acordo com a prioridade da fila, ele substitui valores de linha anteriores, se for dada.

Eu estou tentando encontrar uma solução usando funções analíticas sobre a mesa, mas ele simplesmente não está se comportando ...

Eu tento:

select last_value(col1 ignore nulls) over () col1,
       last_value(col2 ignore nulls) over () col2,
       last_value(col3 ignore nulls) over () col3
from (select * from THE_TABLE order by row_priority)
where rownum = 1

ou o inverso:

select first_value(col1 ignore nulls) over () col1,
       first_value(col2 ignore nulls) over () col2,
       first_value(col3 ignore nulls) over () col3
from (select * from THE_TABLE order by row_priority desc)
where rownum = 1

E nem parecem ignorar valores nulos. Alguma dica?

Foi útil?

Solução

Você precisa colocar rownum = 1 FORA a consulta analítica

SELECT  *
FROM    (   select          last_value(col1 ignore nulls) over () col1,
                            last_value(col2 ignore nulls) over () col2,
                            last_value(col3 ignore nulls) over () col3
            from (select * from THE_TABLE ORDER BY ROW_PRIORITY)
        )
WHERE   ROWNUM = 1

o que resulta em (usando os valores acima):

COL1   COL2    COL3
------ ------- ----
0.2    100     3

Outras dicas

A função COALESCE podem ser de ajuda para você aqui. Talvez como ...

select first_value(coalesce(col1,0) ignore nulls) over () col1,
       first_value(coalesce(col2,0) ignore nulls) over () col2,
       first_value(coalesce(col3,0) ignore nulls) over () col3
from THE_TABLE

Uma alternativa:

SELECT
  MAX(col1) KEEP (DENSE_RANK LAST ORDER BY row_priority),
  MAX(col2) KEEP (DENSE_RANK LAST ORDER BY row_priority),
  MAX(col3) KEEP (DENSE_RANK LAST ORDER BY row_priority)
FROM the_table

O desempenho deste pode ser diferente da versão analítica; se é melhor ou pior depende de seus dados e ambiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top