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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top