我有一个简单的mysql表,其中包含名称和年龄列.我需要找到包含最多记录的年龄范围(比如长度为5).请注意,范围可以是任何东西(例如1至5年或2至6年).我在http://sqlfiddle.com/#!2/a65265/1创建了一个sqlfiddle
我尝试过使用DIV并在论坛中搜索,但我能得到的最接近的是预定义范围,如5-10岁,10-15岁等.我需要一个更通用的解决方案,适用于所有可能的年龄范围.
select 5 * floor((t.age-o.offset)/5) + o.offset as from_age
,5 * (floor((t.age-o.offset)/5) + 1) + o.offset - 1 as to_age
,count(*) as cnt
from test as t
cross join ( select 0 as offset
union all select 1
union all select 2
union all select 3
union all select 4
) as o
group by o.offset
,floor((t.age-o.offset)/5)
order by cnt desc
limit 1
Run Code Online (Sandbox Code Playgroud)
基本思想 -
每行重复5次,偏移量在0到4的范围内.
每个偏移量导致元素的不同分布,如下图所示:
x: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| | | | | | | | | | | | | | | | | | | |
------------- ------------- ------------- -------------
floor((x-0)/5): 0 1 2 3
x: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| | | | | | | | | | | | | | | | | | | |
- ------------- ------------- ------------- -------------
floor((x-1)/5): 0 1 2 3
x: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| | | | | | | | | | | | | | | | | | | |
---- ------------- ------------- ------------- -------------
floor((x-2)/5): 0 1 2 3
x: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| | | | | | | | | | | | | | | | | | | |
------- ------------- ------------- ------------- -------------
floor((x-3)/5): 0 1 2 3
x: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| | | | | | | | | | | | | | | | | | | |
---------- ------------- ------------- ------------- -------------
floor((x-4)/5): 0 1 2 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |