如何在sql中的表中按组填充缺少的日期

use*_*423 11 sql loops date

我想知道如何使用循环来填充缺省日期,其值为零,基于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
Run Code Online (Sandbox Code Playgroud)

我还有一个表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
...
Run Code Online (Sandbox Code Playgroud)

如何使用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
Run Code Online (Sandbox Code Playgroud)

请把你的代码和建议发给我.非常感谢你!

pet*_*erm 16

你可以这样做而没有循环

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
Run Code Online (Sandbox Code Playgroud)

最里面的子查询每组抓取最小和最大日期.然后交叉连接TableB生成每组最小 - 最大范围内的所有可能日期.最后外部选择使用外部联接TableA和填充value列与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演示

  • 它工作完美!非常感谢。 (2认同)