2013-09-29 8 views
5

Voglio sapere come utilizzare i cicli per riempire le date mancanti con valore zero in base alle date di inizio/fine per gruppi in sql in modo da avere serie temporali consecutive in ciascun gruppo. Ho due domande.Come compilare date mancanti per gruppi in una tabella in sql

  1. come eseguire il ciclo per ciascun gruppo?
  2. Come utilizzare le date di inizio/fine per ciascun gruppo per riempire dinamicamente le date mancanti?

Il mio input e l'output previsto sono elencati come di seguito.

Ingresso: Ho una tabella A come

date  value  grp_no 
8/06/12 1   1 
8/08/12 1   1 
8/09/12 0   1 
8/07/12 2   2 
8/08/12 1   2 
8/12/12 3   2 

anche io ho una tabella B che può essere utilizzato a sinistra unirsi con A per riempire date mancanti.

date 
... 
8/05/12 
8/06/12 
8/07/12 
8/08/12 
8/09/12 
8/10/12 
8/11/12 
8/12/12 
8/13/12 
... 

Come posso usare A e B per generare il seguente output in SQL?

uscita:

date  value  grp_no 
8/06/12 1   1 
8/07/12 0   1 
8/08/12 1   1 
8/09/12 0   1 
8/07/12 2   2 
8/08/12 1   2 
8/09/12 0   2 
8/10/12 0   2 
8/11/12 0   2 
8/12/12 3   2 

Inviatemi il vostro codice e suggestione. Grazie mille in anticipo !!!

+0

quali sono le colonne in B? – mhn

+0

Ha solo una colonna della data - tutte le date consecutive dell'anno 2012. – user2824423

+1

Quale sistema di database e versione stai usando? –

risposta

6

si può fare in questo modo, senza loop

SELECT p.date, COALESCE(a.value, 0) value, p.grp_no 
    FROM 
(
    SELECT grp_no, date 
    FROM 
    (
    SELECT grp_no, MIN(date) min_date, MAX(date) max_date 
     FROM tableA 
    GROUP BY grp_no 
) q CROSS JOIN tableb b 
    WHERE b.date BETWEEN q.min_date AND q.max_date 
) p LEFT JOIN TableA a 
    ON p.grp_no = a.grp_no 
    AND p.date = a.date 

Il più interno palio sottoquery min e max risale per ogni gruppo. Quindi cross join con TableB produce tutte le date possibili all'interno della gamma min-max per gruppo. Infine, la selezione esterna utilizza l'unione esterna con TableA e riempie la colonna value con 0 per le date mancanti in TableA.

uscita:

 
|  DATE | VALUE | GRP_NO | 
|------------|-------|--------| 
| 2012-08-06 |  1 |  1 | 
| 2012-08-07 |  0 |  1 | 
| 2012-08-08 |  1 |  1 | 
| 2012-08-09 |  0 |  1 | 
| 2012-08-07 |  2 |  2 | 
| 2012-08-08 |  1 |  2 | 
| 2012-08-09 |  0 |  2 | 
| 2012-08-10 |  0 |  2 | 
| 2012-08-11 |  0 |  2 | 
| 2012-08-12 |  3 |  2 | 

Ecco SQLFiddle demo

+0

Grazie mille! Proverò oggi e ti faccio sapere se funziona! – user2824423

+1

Funziona perfettamente! Grazie mille. – user2824423

+0

@ user2824423 Sei il benvenuto. Buona fortuna :) – peterm

Problemi correlati