You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 22:39:23