mysql - 计算具有特定列的所有行并按周分组

标签 mysql sql

一段时间以来,我一直在尝试创建一个查询,该查询每天计算一个表中包含具有特定 ID 的列的所有行,然后根据 UNIX 时间戳列将它们分组为每周值。我有一个包含 3700 万行的中型数据集,并且一直在尝试运行以下类型的查询:

SELECT DATE(timestamp), COUNT(*) FROM `table` WHERE ( date(timestamp) 
between "YYYY-MM-DD" and "YYYY-MM-DD" and column_group_id=X ) 
group by week(date(startdate)) 

虽然我得到了奇怪的结果,并且查询没有正确地对计数进行分组,但在结果计数列上显示了太大的值(我通过查询非常小的特定数据集验证了值错误。)

如果我改为按 date(startdate) 分组,则行数按天匹配,但我想将这些每日行数合并为每周行数。这怎么可能?数据需要格式:

2006-01-01 | 5 
2006-01-08 | 10

第一列是日期时间戳,第二列是每周的行数。

最佳答案

您的查询是不确定的,因此您得到意想不到的结果也就不足为奇了。我的意思是您可以对相同的数据运行此查询 5 次并获得 5 个不同的结果集。这是因为您选择的是 DATE(timestamp) 但按 WEEK(DATE(startdate)) 分组,因此查询返回第一行的时间在每个开始日期周以任何顺序出现。

考虑以下两行(为了便于阅读,时间戳采用日期格式):

TimeStamp       StartDate
20120601        20120601
20120701        20120601

您的查询按 WEEK(StartDate) 分组,即 23,因为两行的计算结果相同,您希望结果有 1 行且计数为 2。

HOWEVER DATE(Timestamp) 也在选择列表中,因为没有 ORDER BY 语句,查询不知道哪个时间戳返回“20120601”或“20120701”。因此,即使在这个小结果集上,您也有 50:50 的机会获得:

TimeStamp       COUNT
20120601        2

并且有 50:50 的机会获得

TimeStamp       COUNT
20120701        2

如果您像这样向数据集添加更多数据:

TimeStamp       StartDate
20120601        20120601
20120701        20120601
20120701        20120701

你可以得到

TimeStamp       COUNT
20120601        2
20120701        1

TimeStamp       COUNT
20120701        2
20120701        1

您可以看到,对于 37,000,000 行,您很快就会得到意想不到且无法预测的结果!

编辑

因为看起来您正在尝试在结果中获取周开始时间,而按周分组时您可以使用以下内容来获取周开始时间(将 CURRENT_TIMESTAMP 替换为您想要的任何列):

SELECT  DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart

然后您也可以按此日期分组以获得每周结果,并避免选择列表中的内容不在您的分组依据中的麻烦。

关于mysql - 计算具有特定列的所有行并按周分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11036294/

相关文章:

mysql - 在 mysql 中运行复杂查询

php - MySQL 和 PHP : Joins & Counts

Java 将值传递到 SQL WHERE 子句中的 IN

java - 如何在IN子句内的SQL查询中设置绑定(bind)变量的值

java - 通过 SQL "select * from "从 java 存储过程返回结果集

java - 批量插入 MySQL 会导致 GC 开销和/或 Java 堆空间错误

php - sql从连接中获取数据并将结果作为关联数组

php - 如何从 MySQL 数据库检索图像并在 html 标签中显示

SQL 架构设置

php - 尝试将两个分组查询合并为一个