【问题标题】:Return the count of rows grouped by week MySQL返回按周 MySQL 分组的行数
【发布时间】:2013-03-12 10:10:51
【问题描述】:

我正在尝试从数据按 WEEK 分组的 MySQL 表中获取行数。

到目前为止,我的查询是:

 "SELECT count(*) as tweets, twitTimeExtracted as date 
  FROM scene.twitData 
  group by week(twitTimeExtracted)"

此查询返回以下数据:

如您所见,周数不正确,我预计从 1 月 7 日星期一(7、14、21、28、4、11 等)开始到本周的每周数据.

我还尝试了原始查询的修改版本:

SELECT count(*) as tweets, twitTimeExtracted as date 
FROM scene.twitData 
WHERE date(twitTimeExtracted) 
   BETWEEN '2013-01-07' and '2013-03-11' 
group by week(twitTimeExtracted)

这会返回与第一个查询相似的结果。

可能与存储在 DATETIME: twitTimeExtracted 列中的某些数据存在不一致的几行数据?我真的不知道我对 MySQL 不是很有经验。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 那么,1 月 7 日星期一是星期几? 1 月 1 日星期一是星期几?也许试试:“按周分组(twitTimeExtracted,1)”
  • 如何这是不正确的?你期待一个神奇的星期开始日期出现吗? (顺便说一句,我也会在YEAR() 上分组..)

标签: php mysql sql database


【解决方案1】:

这会将datetime 值转换为一周中的相应星期一

select count(*) as tweets,
       str_to_date(concat(yearweek(twitTimeExtracted), ' monday'), '%X%V %W') as `date`
from twitData 
group by yearweek(twitTimeExtracted)

yearweek 返回周和年。与字符串 monday 一起,str_to_date 为您提供星期一的 datetime 值。

如果您的一周从Monday 开始,请改用yearweek(twitTimeExtracted, 1)

【讨论】:

  • 当日期来自不同年份时,这不会失败吗?
  • @NateS 我不这么认为。 yearweek 提供年 周,因此它应该可以工作,即使您的数据集中有多年。请查看更新的答案。
【解决方案2】:

始终获取一周中的星期一的一个选项是使用 adddate:

SELECT count(*) as tweets, adddate(twitTimeExtracted, INTERVAL 2-DAYOFWEEK(twitTimeExtracted) DAY)
FROM twitData 
WHERE date(twitTimeExtracted) 
   BETWEEN '2013-01-07' and '2013-03-11' 
GROUP BY adddate(twitTimeExtracted, INTERVAL 2-DAYOFWEEK(twitTimeExtracted) DAY)

SQL Fiddle Demo

【讨论】:

  • 谢谢,这个查询产生了大约 19,000 行结果。每周的结果不会压缩为一个结果行数。
  • @user1814487 -- 不知道为什么,你看到 SQL Fiddle 了吗?不如预期?
  • SQL 小提琴按预期工作我相信但是当我在我的服务器上运行查询时,我会从返回的那一周获得所有结果,日期为该月的第一天和时间count(*) 列中的 1:例如 i.imgur.com/kMMIAel.png
  • 日期现在是正确的,但从 1 月 7 日星期一开始(7、14、21、28、4、11 等...)
【解决方案3】:

试试这个:

 SELECT count(*) as tweets, 
     date_add('7 Jan 2012', day, datediff('7 Jan 2012', twitTimeExtracted)) % 7   
 FROM scene.twitData 
 group by date_add('7 Jan 2012', day, datediff('7 Jan 2012', twitTimeExtracted)) % 7

【讨论】:

  • 谢谢,但这会引发错误:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 'day, datediff('7 Jan 2012', twitTimeExtracted)) Mod 7 FROM scene.twitData ' 在第 2 行"
【解决方案4】:

另一种解决方案:

SELECT DATE(DATE_SUB(yourDate, INTERVAL WEEKDAY(yourDate) DAY));

例如:

SELECT DATE(DATE_SUB(DATE("2016-04-11"), INTERVAL WEEKDAY(DATE("2016-04-11")) DAY));

【讨论】:

    【解决方案5】:

    你也可以试试这个。

    select 
    DATE_ADD(DATE(date), INTERVAL (7 - DAYOFWEEK(date)) DAY) as weekend,
    count(tweets)
    from scene.twitData 
      group by weekend;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2020-07-23
      相关资源
      最近更新 更多