在MySQL

时间:2017-01-02 11:18:14

标签: mysql

我有一张桌子,上面有一些日期和一些值,我希望按周计算总和。

我使用此查询来执行此操作

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]并且我不做我知道为什么开始日不正确

1 个答案:

答案 0 :(得分:1)

您按WEEK(date)进行分组,以便每周获得一个结果行。表达式

CONCAT(date, '-', date + INTERVAL 6 DAY)

但不是聚合(例如SUMMAX等)。因此,此表达式中的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);