一段时间以来,我一直在尝试创建一个查询,该查询每天计算一个表中包含具有特定 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/