Selecionar maior data mês anterior

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
batofao
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 40
Registrado em: Seg, 30 Ago 2010 9:47 am
Localização: Jundiai

boa tarde,

aguem sabe como posso selecionar a maior data de uma mês anterior ?

obg
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

brother..
explica melhor sua necessidade..


você pode dar um max() e limitar o seu "mês anterior" no where
batofao
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 40
Registrado em: Seg, 30 Ago 2010 9:47 am
Localização: Jundiai

o que acontece é o seguinte

tenho esse select:

Selecionar tudo

select zx.nome_cliente, zx.nome_do_fundo, co.data
,(select max(x.data) from cotacoes x where x.data = add_months(co.data,-1) AND co.cod_produto = x.cod_produto )"DATA_mês_ANTEIOR"
from cotacoes CO,  zxt_cal_rentabilidade ZX
          where zx.nome_cliente = (:nome) and co.cod_produto = zx.cod_produto and 
          co.data in (select max(RET_DATA) from 
              (select to_date(ZT.data_entrada)+level-1 RET_DATA 
              from zxt_cal_rentabilidade ZT 
              connect by 
              to_date(ZT.data_entrada)+level-1 
              <= last_day(to_date(ZT.data_final)) 
              MINUS 
 select  FI.data from feriados_internacionais FI
  where cod_calendario = '-1316' 
    ) 
GROUP by 
to_char(RET_DATA,'MM/YYYY') 
)
order by co.data
na segunda linha estou selecionando a data da minha cotação - 1 mês, só que quando eu faço isso essa data pode cair em sabado domingo ou feriado e não tenho essa data, então ele me retorna um valor null,
preciso então subtrair um mês e selecionar a maior data dele automaticamente ele já vai me gerar o ultimo dia ultil...

pelo menos to pensando assim ...
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

na minha limitada visão..
do jeito que ta ai você verifica atraves do dia da semana se não é sabado nem domingo.. se for você reduz 1 ou 2 dias.. agora feriado so tendo uma tabela "calendario" para você conseguir saber se é um dia util ou não
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Seguindo a tua lógica, acho que algo assim atende a tua necessidade, mas é como o Victor falou:
feriado so tendo uma tabela "calendario" para você conseguir saber se é um dia util ou não
Segue o código..

Selecionar tudo

SELECT zx.nome_cliente
      ,zx.nome_do_fundo
      ,co.data
      ,(SELECT MAX(x.data)
          FROM cotacoes x
         WHERE x.data = ADD_MONTHS(co.data, -1)
           AND co.cod_produto = x.cod_produto
           AND TO_CHAR(x.data, 'd') NOT IN (1, 7)) "DATA_mês_ANTEIOR"
  FROM cotacoes co
      ,zxt_cal_rentabilidade zx
 WHERE zx.nome_cliente = (:nome)
   AND co.cod_produto = zx.cod_produto
   AND co.data IN (SELECT MAX(ret_data)
                     FROM (SELECT TO_DATE(zt.data_entrada) + LEVEL - 1 ret_data
                             FROM zxt_cal_rentabilidade zt
                           CONNECT BY TO_DATE(zt.data_entrada) + LEVEL - 1 <= LAST_DAY(TO_DATE(zt.data_final))
                           MINUS
                           SELECT fi.data
                             FROM feriados_internacionais fi
                            WHERE cod_calendario = '-1316')
                    GROUP BY TO_CHAR(ret_data, 'MM/YYYY'))
 ORDER BY co.data
Responder
  • Informação