填写运行总计的缺失日期
Posted
技术标签:
【中文标题】填写运行总计的缺失日期【英文标题】:Fill Missing Dates for Running Total 【发布时间】:2021-05-24 03:36:03 【问题描述】:我有这张桌子
UserID | Date | Sale |
---|---|---|
A | 2021-05-01 | 3 |
A | 2021-05-03 | 1 |
A | 2021-05-03 | 2 |
A | 2021-05-05 | 5 |
B | 2021-05-02 | 4 |
B | 2021-05-03 | 10 |
我需要的是这样的东西。
UserID | Date | DailySale | RunningSale |
---|---|---|---|
A | 2021-05-01 | 3 | 3 |
A | 2021-05-02 | NULL | 3 |
A | 2021-05-03 | 3 | 6 |
A | 2021-05-04 | NULL | 6 |
A | 2021-05-05 | 5 | 11 |
B | 2021-05-01 | NULL | 0 |
B | 2021-05-02 | 4 | 4 |
B | 2021-05-03 | 10 | 14 |
B | 2021-05-04 | NULL | 14 |
B | 2021-05-05 | NULL | 14 |
我需要加入特定时间段内的所有日期,以便我可以按日期创建运行总销售额。 我想出了如何分别完成这一切,我知道如何使用(通过分区)进行运行总和,并且我知道我可以将日历表加入我的销售表以获取时间段。但我想通过 distinct(datetime) 尝试自我加入方法,但我不确定如何去做。我试过这个,但它对我不起作用。我有超过 100 万行,因此完成处理需要 2 多分钟,并且运行总和列看起来与每日总和列完全一样。
最好的方法是什么?
编辑:更正的表格总和
【问题讨论】:
请检查您的预期输出,因为那里的数字与您上面的示例数据不完全一致。 【参考方案1】:您需要一个包含所有日期的日历表。考虑以下方法:
WITH dates AS (
SELECT '2021-05-01' AS Date UNION ALL
SELECT '2021-05-02' UNION ALL
SELECT '2021-05-03' UNION ALL
SELECT '2021-05-04' UNION ALL
SELECT '2021-05-05'
)
SELECT
u.UserID,
d.Date,
SUM(t.Sale) AS DailySale,
SUM(COALESCE(SUM(t.Sale), 0)) OVER (PARTITION BY u.UserID ORDER BY d.Date) AS RunningSale
FROM (SELECT DISTINCT UserID FROM yourTable) u
CROSS JOIN dates d
LEFT JOIN yourTable t
ON t.UserID = u.UserID AND t.Date = d.Date
GROUP BY
u.UserID,
d.Date
ORDER BY
u.UserID,
d.Date
Demo
【讨论】:
我们更喜欢将数据作为表格文本而不是图像:) @DaleK 我大体上同意你的观点,但在这种情况下,我还删除了一个演示链接(诚然,它可能在未来的任何时候中断)。 @Question,我按照你的逻辑得到了 t.date 部分,我得到 Column 't.Date' 在选择列表中无效,因为它不包含在聚合函数或GROUP BY 子句。我没有 ...这就是为什么我不选择t.date
,我选择d.date
。请以我的演示为起点,不要到处复制粘贴。
@TimBiegeleisen 是的,我打错了。我的问题更多地与我思考问题有关,并希望以冗余的方式显示两个日期。此外,我花了一段时间才掌握了将 cte 与原始表格一起使用的窍门。不过我把一切都整理好了!非常感谢您的帮助。以上是关于填写运行总计的缺失日期的主要内容,如果未能解决你的问题,请参考以下文章