GROUP BY ID范围?

时间:2009-07-11 15:00:25

标签: language-agnostic mysql group-by

给定这样的数据集;

+-----+---------------------+--------+
| id  | date                | result |
+-----+---------------------+--------+
| 121 | 2009-07-11 13:23:24 |     -1 | 
| 122 | 2009-07-11 13:23:24 |     -1 | 
| 123 | 2009-07-11 13:23:24 |     -1 | 
| 124 | 2009-07-11 13:23:24 |     -1 | 
| 125 | 2009-07-11 13:23:24 |     -1 | 
| 126 | 2009-07-11 13:23:24 |     -1 | 
| 127 | 2009-07-11 13:23:24 |     -1 | 
| 128 | 2009-07-11 13:23:24 |     -1 | 
| 129 | 2009-07-11 13:23:24 |     -1 | 
| 130 | 2009-07-11 13:23:24 |     -1 | 
| 131 | 2009-07-11 13:23:24 |     -1 | 
| 132 | 2009-07-11 13:23:24 |     -1 | 
| 133 | 2009-07-11 13:23:24 |     -1 | 
| 134 | 2009-07-11 13:23:24 |     -1 | 
| 135 | 2009-07-11 13:23:24 |     -1 | 
| 136 | 2009-07-11 13:23:24 |     -1 | 
| 137 | 2009-07-11 13:23:24 |     -1 | 
| 138 | 2009-07-11 13:23:24 |      1 | 
| 139 | 2009-07-11 13:23:24 |      0 | 
| 140 | 2009-07-11 13:23:24 |     -1 | 
+-----+---------------------+--------+

我如何一次按第5天的记录对结果进行分组。上述结果是实时数据的一部分,表中有超过100,000个结果行并且其增长。基本上我想测量随时间的变化,所以想要对每个X记录的结果进行求和。在实际数据中,我将做100或1000,但对于上面的数据,也许每5个。

如果我可以按日期排序,我会做这样的事情;

SELECT
   DATE_FORMAT(date, '%h%i') ym,
   COUNT(result) 'Total Games', 
   SUM(result) as 'Score'
FROM nn_log
GROUP BY ym;

我无法找到一种与数字做类似事情的方法。订单按日期排序,但我希望每x个结果拆分数据。假设没有空行是安全的。

使用您可以执行多项选择的数据执行上述操作;

SELECT SUM(result) FROM table LIMIT 0,5;
SELECT SUM(result) FROM table LIMIT 5,5;
SELECT SUM(result) FROM table LIMIT 10,5;

这显然不是扩大到更大问题的好方法。我可以写一个循环,但我想减少查询次数。

3 个答案:

答案 0 :(得分:4)

您可以在ROW NUMBER上使用整数除法来执行此操作。

如果您认为您的id列是连续的,请使用:GROUP BY FLOOR(id / 5)

答案 1 :(得分:4)

怎么样......

SELECT
   floor(id / 5) ym,
   COUNT(result) 'Total Games', 
   SUM(result) as 'Score'
FROM nn_log
GROUP BY ym;

(我假设id是相关的)

在您的查询中,这是相同的想法,只使用ID来分组而不是当天。

答案 2 :(得分:0)

按年份分组(your_date),星期(your_date)

将按7天的间隔进行分组,这可能对您有用。