小编典典

如何在SQL中的表中按组填写缺少的日期

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

请给我您的代码和建议。提前非常感谢您!!!


阅读 138

收藏
2021-03-10

共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在每个组的最小-
最大范围内生成所有可能的日期。最后,外部选择将外部联接与一起使用,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 演示

2021-03-10