2

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

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

4

2 回答 2

1

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

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

TimeStamp       StartDate
20120601        20120601
20120701        20120601

您的查询按 23 进行分组WEEK(StartDate),因为两行的计算结果相同,因此您希望结果有 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 行,您很快就会得到您不期望也无法预测的结果!

编辑

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

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

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

于 2012-06-14T15:48:44.083 回答
0

试试这个

SELECT DATE(timestamp), COUNT(week(date(startdate))) FROM `table` WHERE ( date(timestamp) 
between "YYYY-MM-DD" and "YYYY-MM-DD" and column_group_id=X ) 
group by week(date(startdate)) 
于 2012-06-14T15:43:54.710 回答