我有一张桌子,上面有一些日期和一些值,我希望按周计算总和。
我使用此查询来执行此操作
SELECT SUM(nb_like) AS nb_like , CONCAT(date, '-', date + INTERVAL 6 DAY) AS week
FROM fb_stats
GROUP BY WEEK(date)
ORDER BY WEEK(date)
问题是:总和不正确(如果我从2016-01-16到2016-01-22 [![在此处输入图像说明] [1]] [1]并且我不做我知道为什么开始日不正确
答案 0 :(得分:1)
您按WEEK(date)
进行分组,以便每周获得一个结果行。表达式
CONCAT(date, '-', date + INTERVAL 6 DAY)
但不是聚合(例如SUM
,MAX
等)。因此,此表达式中的date
只是在任意选择的一周记录中找到的日期之一。
你想要的是本周的第一天。为了做到这一点,首先要确保为WEEK
函数使用适当的模式(或者更确切地说YEARWEEK
,以便不混合年份),以确保每周选择的那一天,例如:
YEARWEEK(date, 2)
从周日开始,你会得到几个星期。模式7会让你从星期一开始一周。请在此处阅读:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week。
然后使用此方法从周开始星期日:
STR_TO_DATE('<yearweek> Sunday', '%X%V %W');
替换&lt; yearweek&gt;与真正的一周。 (如果您决定使用模式7,请将'Sunday'替换为'Monday'。)
完整的查询:
SELECT
SUM(nb_like) AS nb_like,
CONCAT
(
STR_TO_DATE(CONCAT(YEARWEEK(date, 2), ' Sunday'), '%X%V %W'),
'-',
STR_TO_DATE(CONCAT(YEARWEEK(date, 2), ' Sunday'), '%X%V %W') + INTERVAL 6 DAY
) AS week
FROM fb_stats
GROUP BY YEARWEEK(date, 2)
ORDER BY YEARWEEK(date, 2);