微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在MySQL中按周分组

如何解决在MySQL中按周分组

可以执行以下两个步骤:

第一,您需要进行一周的截断操作-拿走您的DATETIME物品并在前一个星期日归还午夜(如果您的业务规则说该周从星期日开始)。

这将成为合适的GROUP BY项目。WEEK()/ YEAR()骇客不适合此功能。每年的最后/第一周确实很乱。

以我的经验,这种表达方式会在周日至周六为您完成一周截断的技巧,

  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

获取星期一-周日星期几,请使用此表达式。

  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))

因此,您可以执行此操作。

  SELECT COUNT(whatever), SUM(whatelse),
         FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) as WEEKSTART,
    FROM TABLE
   GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))

如何在MySQL中按周分组?

其次,您需要在该截断日期前增加六天,以便可以显示每周的最后一天以及第一天。

这是嵌套查询的一种好方法

SELECT whats, elses, weekstart, weekstart + INTERVAL 6 DAY AS weekend
  FROM (
  SELECT COUNT(whatever) AS whats, SUM(whatelse) AS elses,
         FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) AS weekstart,
    FROM TABLE
   GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))
  ) AS summary
ORDER BY weekstart

做很多这样的事情吗?我建议您创建一个存储的Trunc_WEEK函数

解决方法

表结构是

Table name: btq_user

name,email,kall,state_id,datain

现在,我想每周统计数量为kall = 1或state_id
in(51,20,46)的数字记录。无论年份是否更改,我都只需要按周(周一至周日)的结果。例如,假设2012年12月31日为星期一,而2013年6月1日为星期日,那么结果应包括一周。不管年份是否更改,都应仅以周为单位。

这是我尝试但无法正常工作的方法。

SELECT 
count( if( A.state_id = 51 or A.state_id = 20 or A.state_id = 46,A.state_id,null  ) ) AS state_total,count( if( A.kall =1,A.kall,null ) ) AS appointment,CONCAT( WEEK( A.datain)," - 
",YEAR( A.datain ) ) AS week
FROM btq_user A
GROUP BY week
ORDER BY A.datain ASC

也有可能显示星期(31-12-2012-6-1-2013)并显示结果吗?

感谢您阅读我的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。