将行划分为相同大小的块并获取某些列的聚合

时间:2016-12-09 14:45:48

标签: mysql sql h2

假设我有一个包含name列和age列的表格,其中包含以下数据:

name  | age
------|-----
harry | 12
adam  | 13
eve   | 14
jill  | 14
John  | 16
alice | 19
smith | 33
bill  | 43
bob   | 66
jones | 78

我想首先按年龄递增顺序排列行(已在上面完成) 然后我想提供一个“组大小”,比如说3.因此,从顶部开始,以3行为单位对表进行精神划分

name  | age
------|-----
harry | 12
adam  | 13
eve   | 14
------------
jill  | 14
John  | 16
alice | 19
------------
smith | 33
bill  | 43
bob   | 66
------------
jones | 78

如果num行不是3的倍数,则最后一个块可以小于3。 我需要每个块中age列的顶部和底部值。所以输出应该是:

min age|max age
-------|-------
  12   | 14
  14   | 19
  33   | 66
  78   | 78

使用嵌套表的天真方式效率不高:

select 
  min(T.age), 
  max(T.age) 
from 
  (select 
     age 
   from 
     users 
   order by age limit 3 offset 6
  ) as T

我更愿意避免选择行并仅使用聚合。

数据库:MySQL和H2。

1 个答案:

答案 0 :(得分:1)

E.g:

SELECT MIN(age)
     , MAX(age) 
  FROM 
     ( SELECT x.*
            , FLOOR(@i:=@i+1/3)*3 i 
         FROM my_table x
            , (SELECT @i:=0) vars ORDER BY age,name) n 
        GROUP 
           BY i;