SQL如何实现fiscal_week变化时累计计数且永不随财年重置?
实现方案
核心逻辑是先识别财周切换的节点,再对节点做累计求和,完全适配你要求的永不重置、新增数据自动顺延的规则。
实现思路
- 不能仅通过
fiscal_week判断周变化,需用fiscal_year + fiscal_week组合作为唯一财周标识,避免跨财年同周数的判断误差 - 用
LAG窗口函数获取按transaction_dt升序排序后的上一行财周标识,和当前行对比,周切换则标记为1,否则标记为0 - 对标记值做全局累加求和,得到最终的
count_column
通用SQL代码(支持所有兼容标准窗口函数的数据库,比如MySQL8.0+、PostgreSQL、Hive、Spark SQL等)
SELECT transaction_dt, fiscal_week, fiscal_year, SUM(week_change_flag) OVER ( ORDER BY transaction_dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS count_column FROM ( SELECT *, CASE WHEN CONCAT(fiscal_year, '-', fiscal_week) = LAG(CONCAT(fiscal_year, '-', fiscal_week), 1, '') OVER (ORDER BY transaction_dt) THEN 0 ELSE 1 END AS week_change_flag FROM 替换为你的财年日历表名 ) t
优化说明
- 若你使用的数据库支持元组比较,可以替换拼接字符串的逻辑,执行效率更高:
CASE WHEN (fiscal_year, fiscal_week) = LAG((fiscal_year, fiscal_week), 1, (0, 0)) OVER (ORDER BY transaction_dt) THEN 0 ELSE 1 END - 若需要将计算结果更新回原表,先给原表新增
count_column字段,再根据你用的数据库语法(比如UPDATE JOIN、MERGE INTO等)将查询结果写入即可 - 后续新增数据时,只要保持按
transaction_dt顺序计算,计数会自动顺延,不需要手动维护起始值
内容的提问来源于stack exchange,提问作者ctrlf_abalone
相关产品推荐
相关产品推荐

