填写运行总计的缺失日期

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 与原始表格一起使用的窍门。不过我把一切都整理好了!非常感谢您的帮助。

以上是关于填写运行总计的缺失日期的主要内容,如果未能解决你的问题,请参考以下文章

填写缺失的日期值并根据前一行填充第二列

SQL Server:填写每个实体具有不同日期范围的缺失日期

按日期和组聚合并在大查询中填写缺失的日期

根据 max 和 min 填写缺失的日期 pandas

根据 max 和 min 填写缺失的日期 pandas

ORACLE SQL:填写缺失的日期