Как заполнить недостающие даты по группам в таблице в sql

Я хочу знать, как использовать циклы для заполнения отсутствующих дат нулевым значением на основе дат начала/конца группами в sql, чтобы у меня были последовательные временные ряды в каждой группе. У меня два вопроса.

  1. как цикл для каждой группы?
  2. как использовать даты начала и окончания для каждой группы, чтобы динамически заполнить недостающие даты?

мой вход и ожидаемый выход перечислены ниже.

вход: у меня есть таблица A как

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

также у меня есть таблица B, которую можно использовать для левого соединения с A для заполнения отсутствующих дат.

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
...

как я могу использовать A и B для создания следующего вывода в sql?

выход:

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

пожалуйста, пришлите мне свой код и предложение. Большое спасибо заранее!!!

1 ответов


вы можете сделать это без петель

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

внутренний подзапрос хватает мин и Макс даты в группе. Тогда крест присоединиться с TableB производит все возможные даты в пределах диапазона min-max для каждой группы. И, наконец, outer select использует внешнее соединение с TableA и заполняет с 0 для дат, которые отсутствуют в TableA.

выход:

|       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 |

здесь SQLFiddle демо