Como faço para selecionar mínimo de datas / max da tabela 2 com base na data na tabela 1?
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?
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.