我想知道如何使用循环根据sql中各组的开始/结束日期来填充零值缺失日期,以便每个组中都有连续的时间序列。我有两个问题。
我的输入和预期输出如下所示。
输入: 我有一张表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
请给我您的代码和建议。提前非常感谢您!!!
您可以像这样不循环
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。
TableB
TableA
value
0
| 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 演示