如何用SQL实现Excel中基于年度周数列生成全局累计周数列?
实现Excel全局累计周数的SQL方案
核心逻辑对应
Excel公式=IF(I727=I726,J726,J726+1)的本质是:按日期顺序逐行比较,若当前行年度周数和上一行相同,全局累计周数不变;否则在上一行基础上加1。用SQL实现的关键是借助窗口函数获取上一行数据,再通过累计求和完成递增逻辑。
通用SQL实现代码
假设你的数据表名为weekly_data,包含日期列record_date(用于保证行顺序和Excel一致)、年度周数列annual_week(对应Excel的Column I),代码如下:
SELECT record_date, annual_week, SUM(flag) OVER (ORDER BY record_date) AS global_cumulative_week FROM ( SELECT record_date, annual_week, CASE -- 第一行无前置数据,标记为1(对应全局累计起始值) WHEN LAG(annual_week) OVER (ORDER BY record_date) IS NULL THEN 1 -- 当前年度周数与上一行不同时,标记为1(触发累计+1) WHEN annual_week != LAG(annual_week) OVER (ORDER BY record_date) THEN 1 -- 年度周数相同时,标记为0(累计值不变) ELSE 0 END AS flag FROM weekly_data ) AS sub;
自定义起始值调整
如果你的全局累计周数不是从1开始(比如初始值是53),只需在外层累计求和后加上「起始值-1」即可。例如起始值为53时:
SUM(flag) OVER (ORDER BY record_date) + 52 AS global_cumulative_week
说明
LAG()函数:用于按日期排序后获取上一行的年度周数,主流数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle)均支持该函数。- 必须按
record_date排序:确保行顺序和Excel逐行存储的顺序完全一致,否则逻辑会出错。
内容的提问来源于stack exchange,提问作者Wheels496
相关产品推荐
相关产品推荐

