Como faço para selecionar mínimo de datas / max da tabela 2 com base na data na tabela 1?

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

Pergunta

Eu tenho uma tabela mensal (apenas detém linhas com o primeiro dia do mês, e restrição exclusiva portanto, apenas um de cada) e uma mesa diariamente com informações semelhantes para cada dia (mesmo negócio, apenas um por dia):

Monthly table       Daily table
-------------       -----------
2009-01-01          2009-01-01
2009-02-01          2009-01-02
: :                 : :
2009-09-01          2009-01-31
                    2009-02-01
                    : :
                    2009-02-28
                    2009-03-01
                    : :
                    2009-09-01

mas pode haver dias que faltam.

Eu quero executar uma consulta que retorna, para cada data na tabela mensal, essa data junto com as datas mínimas e máximas para esse mês na tabela diária (usando SQL padrão de preferência de específica do DB2 se for absolutamente necessário).

Assim, se a última semana de janeiro e primeira semana de fevereiro está faltando, eu preciso:

MonthStart  FirstDay    LastDay
----------  ----------  ----------
2009-01-01  2009-01-01  2009-01-24
2009-02-01  2009-02-08  2009-02-28
: :
2009-09-01  2009-09-01  2009-01-30

Aqui está a consulta que tenho:

select m.date as m1,               
       dx.d1 as m2,                          
       dx.d2 as m3                           
from   monthly m,              
       ( select min(d.date) as d1,
                max(d.date) as d2        
         from   daily d            
         where  month(d.date) = month(m.date)
         and    year(d.date) = year(m.date)    
       ) as dx;

mas eu estou recebendo o erro:

DSNT408I SQLCODE = -206, ERROR: M.DATE IS NOT A COLUMN OF
AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE IDENTIFIED
IN A FROM CLAUSE, OR IS NOT A COLUMN OF THE TRIGGERING
TABLE OF A TRIGGER
DSNT418I SQLSTATE = 42703 SQLSTATE RETURN CODE

Alguém tem algum conselho sobre a melhor forma de fazer isso?

Foi útil?

Solução

SELECT m.date as m1,               
       MIN(d.date) as m2,                          
       MAX(d.date) as m3
       -- COUNT(d.date) as NbOfDays  -- if so desired...                          
FROM monthly m
JOIN daily d ON month(d.date) = month(m.date) and year(d.date) = year(m.date) 
WHERE -- some condition
GROUP BY m.date
ORDER BY m.date -- or something else...

Note que este tipo de consulta (como os outros mostrado na pergunta e nas respostas até agora, são relativamente lento, uma vez que implica uma varredura mesa para o mês (x) e no ano (x) pode ser calculado para cada [qualificação] linha. (ou seja, colocar uma faixa na data na cláusula WHERE seria, naturalmente, ajuda). Se este tipo de consulta é executado com freqüência e se o tamanho da tabela é significativa, i t pode ser útil para adicionar um coluna para estes valores calculados (ou, eventualmente, para o valor combinado (ano-mês), para que não só o cálculo é desnecessário, mas a coluna subjacente (s) podem ser indexados.

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