Come posso selezionare le date min / max dalla tabella 2 in base alla data nella tabella 1?
Domanda
Ho una tabella mensile (contiene solo le righe con il primo giorno del mese e un vincolo univoco, quindi solo uno di ciascuno) e una tabella giornaliera con informazioni simili per ogni giorno (stesso affare, solo uno al giorno):
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
ma potrebbero mancare giorni.
Voglio eseguire una query che ritorni, per ogni data nella tabella mensile, quella data insieme alle date minima e massima per quel mese nella tabella giornaliera (usando SQL standard preferibilmente specifico di DB2 se assolutamente necessario).
Quindi, se mancano l'ultima settimana di gennaio e la prima settimana di febbraio, ho bisogno di:
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
Ecco la domanda che ho:
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;
ma sto ricevendo l'errore:
DSNT408I SQLCODE = -206, ERRORE: M.DATE NON È UNA COLONNA DI
TABELLA INSERITA, TABELLA AGGIORNATA O QUALSIASI TABELLA IDENTIFICATA
IN A FROM CLAUSE, O NON È UNA COLONNA DEL TRIGGERING
TABELLA DI UN GRILLETTO
DSNT418I SQLSTATE = 42703 SQLSTATE RETURN CODE
Qualcuno ha qualche consiglio sul modo migliore per farlo?
Soluzione
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...
Nota che questo tipo di query (come gli altri mostrati nella domanda e nelle risposte finora, sono relativamente lenti, in quanto implicano una scansione della tabella in modo che il mese (x) e l'anno (x) possano essere calcolati per ogni riga [qualificante]. (vale a dire inserire un intervallo di date nella clausola WHERE sarebbe ovviamente utile). Se questo tipo di query viene eseguito frequentemente e se la dimensione della tabella è significativa, i t può essere utile per aggiungere un colonna per questi valori calcolati (o possibilmente per il valore combinato (Anno-Mese), in modo che non solo il calcolo non sia necessario ma che le colonne sottostanti possano essere indicizzate.