Azure SQL Database如何实现日期区间内按日按类别汇总值
Azure SQL 日度区间统计实现方案
这个需求可以直接通过SQL实现,核心是先将日期区间粒度的源表数据展开为单日粒度,再做分组聚合。
你之前使用窗口函数的写法无法得到正确结果,核心原因是窗口函数的计算粒度和源表行粒度完全一致:源表每行对应一个日期区间而非单个自然日,没有对区间做拆分展开的前提下,无论怎么调整分区条件,都无法覆盖区间内未被显式存储为
[Date begin]的日期。
实现逻辑
- 首先通过递归CTE生成源表覆盖时间范围内的所有连续自然日序列
- 将自然日序列与源表做关联,匹配所有当日落在记录生效区间(
[Date begin]到[Date End]闭区间)内的记录 - 按自然日、类别两个维度分组,对
Value字段求和得到最终统计值
完整SQL代码
WITH DateSeq AS ( -- 锚点:取源表最小开始日期作为日期序列起点 SELECT MIN([Date begin]) AS StatDate FROM [TABLE STARTER] UNION ALL -- 递归逐天生成日期,直到达到源表最大结束日期 SELECT DATEADD(DAY, 1, StatDate) FROM DateSeq WHERE StatDate < (SELECT MAX([Date End]) FROM [TABLE STARTER]) ) SELECT ds.StatDate AS [统计日期], s.Category AS [类别], SUM(CAST(s.Value AS FLOAT)) AS [汇总值] FROM DateSeq ds INNER JOIN [TABLE STARTER] s ON ds.StatDate >= s.[Date begin] AND ds.StatDate <= s.[Date End] GROUP BY ds.StatDate, s.Category ORDER BY ds.StatDate, s.Category -- 取消递归层数限制,避免长日期区间触发默认100层递归报错 OPTION (MAXRECURSION 0);
样例数据验证
针对你给出的3条测试数据,执行上述代码后返回结果完全符合预期:
- 2021-01-01,类别1:0.2;类别2:0.3
- 2021-01-02,类别1:0.3(0.2+0.1);类别2:0.3
- 2021-01-03,类别1:0.3(0.2+0.1)
优化提示
- 所有带空格的字段名、表名必须用方括号
[]包裹,否则会触发语法错误 - 如果需要统计的日期跨度超过10年,建议提前创建独立的日历维度表做关联,性能会优于递归CTE生成日期序列的方式
内容的提问来源于stack exchange,提问作者Ouakrat
相关产品推荐
相关产品推荐

