我需要将数据库中的某些行分组为n。
示例:
select max(data) from tableA group by (groups of 2) order by id;
结果: 20,30,5
所以...
第1组持有id 1& 2,组2持有id 3& 4,组3将保持id 5& 6。
tableA
| id | data |
---------------
| 1 | 10 |
| 2 | 20 |
| 3 | 15 |
| 4 | 30 |
| 5 | 5 |
| 6 | 0 |
---------------
有没有办法用SQL实现这个?
注意:系统正在MySql上运行。
答案 0 :(得分:5)
select
(mod(id, 2) + id)/2 as id_group,
max(data) as max_data
from tableA
group by 1
查看在sqlfiddle
中运行的此查询答案 1 :(得分:3)
由于GROUP BY
可以包含任意表达式,因此如果CASE
的值{1}}等于1,则可以使用id
返回MOD 2
,id - 1
} 除此以外。这将它们成对分组,从1开始递增。
SELECT MAX(data) AS maxdata
FROM tableA
/* GROUP BY the id or (id - 1) depending on the result of its modulo 2 */
GROUP BY CASE WHEN id MOD 2 = 1 THEN id ELSE (id - 1) END
一夜之间,我觉得这个解决方案只适用于id
的顺序值这一事实。如果删除了行,则不会再获得正确的结果。因此,这里有一个版本可以解释非连续的,有缺口的id
s:
SET @rowid = 0;
SELECT
MAX(data) AS maxdata
FROM (
SELECT
@rowid := @rowid + 1 AS rd,
data
FROM tableA
) subq
GROUP BY CASE WHEN rd MOD 2 = 1 THEN rd ELSE (rd - 1) END