Quando campo for nulo, mostrar de registro anterior

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Bom dia,

Estou fazendo um gráfico para exibir cotações de moeda. Minha tabela não possui a cotação de todos os dias, o que deixa o gráfico com falhas. Para isso, quero fazer uma query que me traga, para os dias onde não haja cotação, a última cotação anterior.

Exemplo: Tabela:

Selecionar tudo

Data  | Taxa
01/01 | 2.23
02/01 | 2.25
03/01 | 
04/01 | 2.30
O resultado do select deve ser:

Selecionar tudo

Data  | Taxa
01/01 | 2.23
02/01 | 2.25
03/01 | 2.25
04/01 | 2.30
Fiz a query abaixo, mas o desempenho é péssimo... Há outra forma de se fazer isso?

Selecionar tudo

SELECT XTAB.DATA,
       (SELECT MAX (MOEDAS_COTACAO.TAXA)KEEP (DENSE_RANK FIRST ORDER BY MOEDAS_COTACAO.DATA DESC NULLS LAST)
          FROM MOEDAS_COTACAO
         WHERE MOEDAS_COTACAO.CODIGO = /*dólar*/ 220
           AND MOEDAS_COTACAO.DATA <= XTAB.DATA) AS TAXA
  FROM (SELECT     TRUNC (SYSDATE) - :XDIAS + LEVEL AS DATA
              FROM DUAL
        CONNECT BY LEVEL <= :XDIAS
          ORDER BY 1) XTAB
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

De cara, se houver apenas "gaps" de um dia apenas, seria possivel usando apenas a função LAG.

Selecionar tudo

NVL(x, LAG(x,1)) ...
Ou se os gaps tiverem limite máximo de dias sem cotação, seria ainda possivel usar o LAG dentro da função
COALESCE.

Selecionar tudo

NVL(X,COALESCE(Lag(x,1) .. , Lag(x,2).. , Lag(x,3)) ) /*limite maximo de 3 dias*/
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Não conhecia essa função LAG(), bem interessante. Pena não servir no meu caso, já que posso ter vários dias sem taxa informada. =/
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Resolvido.

Selecionar tudo

SELECT XTAB.DATA,
       LAST_VALUE (MOEDAS_COTACAO.TAXA IGNORE NULLS) OVER (ORDER BY XTAB.DATA) AS TAXA
  FROM MOEDAS_COTACAO,
       (SELECT     TRUNC (SYSDATE) - :XDIAS + LEVEL AS DATA
              FROM DUAL
        CONNECT BY LEVEL <= :XDIAS
          ORDER BY 1) XTAB
 WHERE MOEDAS_COTACAO.DATA(+) = XTAB.DATA
  AND MOEDAS_COTACAO.CODIGO(+) = /*dólar*/ 220
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Legal, parabéns.

Selecionar tudo

LAST_VALUE (MOEDAS_COTACAO.TAXA IGNORE NULLS)
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

só pra constar, existe também o LEAD...

LAG - linha de trás
LEAD - linha da frente

:D
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 19 visitantes