1

我需要将数据库中的一些行以 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 上。

4

2 回答 2

5
select
    (mod(id, 2) + id)/2 as id_group,
    max(data) as max_data
from tableA
group by 1

查看在sqlfiddle中运行的此查询

于 2012-12-02T03:26:26.970 回答
3

由于GROUP BY可以容纳任意表达式,您可以使用它CASE来返回id如果其值MOD 2等于 1,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

这是 SQLfiddle.com 上的演示

允许不连续的 id

更新

一夜之间,我对这个解决方案仅适用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

和更新的 SQLfiddle...

于 2012-12-02T03:36:43.230 回答