Mysql -按周分组,但从1开始计数

voase2hg  于 12个月前  发布在  Mysql
关注(0)|答案(3)|浏览(104)

假设我有这个查询:

select 
week(sr.transactionDate) AS week_number,
sum(sr.digitalEarnings)
from
sales_report as sr
where `sr`.`transactionDate` BETWEEN '2022-05-01' AND '2022-12-31'
group by week_number
order by week_number;

它返回如下数据:

我知道这是“一年中的周数”,但我实际上是想把数据从1开始分成几周。即,此阶段的第1周,此阶段的第2周等。
我该怎么做呢?

vaqhlq81

vaqhlq811#

您可以直接从交易日期计算周数。假设default_week_format系统变量保持不变,则以Sunday开始计算周;调整您的范围起始日期,以查找当天或之前的星期日,并计算从该日期到事务处理日期的周数,添加一个以从第1周开始,而不是从第0周开始:

floor(datediff(sr.transactionDate,'2022-05-01' - interval dayofweek('2022-05-01')-1 day) / 7) + 1

我强烈建议不要使用week();其跨年度或接近年度开始或结束时的行为通常不利于报告目的。特别是减去或比较两周的值可能是有问题的。

y0u0uwnf

y0u0uwnf2#

使用ROW_NUMBER()如何?尽管这只在v8及以上版本中可用:
https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number

SELECT 
    week(sr.transactionDate) AS week_number,
    ROW_NUMBER() OVER (GROUP BY week_number ORDER BY week_number) AS week_n,
    sum(sr.digitalEarnings)
 FROM
     sales_report as sr
 WHERE `sr`.`transactionDate` BETWEEN '2022-05-01' AND '2022-12-31'
 GROUP BY week_number
 ORDER BY week_number;
1hdlvixo

1hdlvixo3#

你可以用一些数学常识:

SELECT week(sr.transactionDate) - MIN(week(sr.transactionDate)) OVER () + 1 AS week_num
FROM ...
WHERE ...
GROUP BY week(sr.transactionDate)

或者这个:

SELECT week(sr.transactionDate) - week('2022-05-01') + 1 AS week_num
FROM ...
WHERE sr.transactionDate BETWEEN '2022-05-01' ...
GROUP BY week(sr.transactionDate)

第一个将从1开始对周进行编号,第二个可能从例如如果过滤数据从2022-05-15开始,则为3。这两个查询都可能有完全缺失周的间隙。

相关问题