在 MySQL 中按周分组

Posted

技术标签:

【中文标题】在 MySQL 中按周分组【英文标题】:Group by week in MySQL 【发布时间】:2013-08-17 11:47:38 【问题描述】:

表结构是,

Table name: btq_user

name, email, kall, state_id, datain

现在我想每周计算 kall = 1 或 state_id in(51,20,46) 的数字记录。 无论年份是否变化,我都只需要每周(周一 - 周日)的结果。例如,31-12-2012 是星期一,6-1-2013 是星期日,所以结果应该包括一周。无论年份是否变化,它都应该只计算几周。

这是我尝试过但不起作用的方法。

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) 的结果?

感谢您阅读我的问题。

【问题讨论】:

看看这个问答。 ***.com/questions/1736010/… 你有关于列数据的索引吗?现在表中有多少条记录? 【参考方案1】:

两个步骤:

第一,您需要一个星期截断操作 - 这将获取您的 DATETIME 项目并返回前一个星期日的午夜(如果您的业务规则规定该周从星期日开始)。

这成为一个合适的 GROUP BY 项目。 WEEK() / YEAR() hack 不适合这个。每年的最后一周/第一周真的很乱。

根据我的经验,这个表达式会为你完成星期截断技巧,星期日 - 星期六,

  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))

How to group by week in 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 函数。

【讨论】:

你能举个例子吗?即使是 2012 年 31 月 12 日到 2013 年 6 月 1 日(周一到周日),我也需要周总计。谢谢

以上是关于在 MySQL 中按周分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿/离子2中按周分组时间戳?

如何获得最近 x 周数据的不同计数,但在红移中按周分组?

如何使用 Django ORM 按周分组

在mysql中计算数据并按周分组

在按周分组的 2 个日期之间在 MYSQL 中生成报告

Mysql按周,按月,按日,按小时分组统计数据