周日为周起始的SQL统计需求:按周一至周日求和
解决方案:自定义周起始与统计范围的SQL实现
绝对可以实现!这种周起始规则(周日为起始)和统计范围(周一至周日)不一致的需求,只要调整日期映射的逻辑就能轻松搞定。核心思路是:先为每个日期绑定一个以周日为起始的周标识,再将该标识映射到对应的「周一至周日」统计区间,最后按周分组求和。
核心逻辑拆解
- 给任意日期计算它所属的「周起始周日」:
- 如果日期是周日,周起始就是它本身
- 如果日期是周一至周六,周起始是它之前的最近一个周日
- 该周对应的统计区间为:周起始周日的下周一 至 周起始周日的下一个周日(即周起始周日+7天)
- 按周起始周日分组,统计区间内的数据总和
各主流数据库实现示例
MySQL
-- 计算每个日期的周标识与统计区间,并求和 SELECT -- 用周日作为周的唯一标识 DATE_SUB(d, INTERVAL (WEEKDAY(d) + 1) % 7 DAY) AS week_identifier_sunday, -- 统计区间:周一至周日 DATE_ADD(DATE_SUB(d, INTERVAL (WEEKDAY(d) + 1) % 7 DAY), INTERVAL 1 DAY) AS stats_start, DATE_ADD(DATE_SUB(d, INTERVAL (WEEKDAY(d) + 1) % 7 DAY), INTERVAL 7 DAY) AS stats_end, SUM(your_value_column) AS total_sum FROM your_table -- 筛选你需要的目标周(比如2018-02-25所属周的统计区间) WHERE d BETWEEN '2018-02-26' AND '2018-03-04' GROUP BY week_identifier_sunday, stats_start, stats_end;
说明:WEEKDAY(d)返回0=周一,6=周日;通过(WEEKDAY(d)+1)%7计算需要回溯的天数,得到最近的周日作为周标识。
PostgreSQL
-- 计算每个日期的周标识与统计区间,并求和 SELECT (d - (EXTRACT(DOW FROM d)::INT) * INTERVAL '1 day')::DATE AS week_identifier_sunday, ((d - (EXTRACT(DOW FROM d)::INT) * INTERVAL '1 day') + INTERVAL '1 day')::DATE AS stats_start, ((d - (EXTRACT(DOW FROM d)::INT) * INTERVAL '1 day') + INTERVAL '7 day')::DATE AS stats_end, SUM(your_value_column) AS total_sum FROM your_table WHERE d BETWEEN '2018-02-26' AND '2018-03-04' GROUP BY week_identifier_sunday, stats_start, stats_end;
说明:EXTRACT(DOW FROM d)返回0=周日,1=周一…6=周六;减去对应天数得到最近的周日。
SQL Server
-- 先设置周日为一周的第一天(确保DATEPART逻辑正确) SET DATEFIRST 7; SELECT DATEADD(DAY, 1 - DATEPART(DW, d), d) AS week_identifier_sunday, DATEADD(DAY, 2 - DATEPART(DW, d), d) AS stats_start, DATEADD(DAY, 8 - DATEPART(DW, d), d) AS stats_end, SUM(your_value_column) AS total_sum FROM your_table WHERE d BETWEEN '2018-02-26' AND '2018-03-04' GROUP BY DATEADD(DAY, 1 - DATEPART(DW, d), d), DATEADD(DAY, 2 - DATEPART(DW, d), d), DATEADD(DAY, 8 - DATEPART(DW, d), d);
说明:DATEPART(DW, d)在DATEFIRST 7下返回1=周日,2=周一…7=周六;通过1-DATEPART(DW,d)计算回溯天数得到周起始周日。
按照这个逻辑,你示例中2018-02-25所属周的统计区间(2018-02-26至2018-03-04)内的数据总和会被正确计算为2468。
内容的提问来源于stack exchange,提问作者unicorn
相关产品推荐
相关产品推荐

