gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:50:21 26 4
gpt4 key购买 nike

我想知道如何使用循环根据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中缺少的日期。

输出:

| DATE |值| 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演示

关于sql - 如何在SQL中按表填写分组缺少的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19075098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com