Mysql找到大多数元素的范围

时间:2016-11-15 18:50:25

标签: mysql sql

我有一个简单的mysql表,其中包含名称和年龄列。我需要找到包含最多记录的年龄范围(比如长度为5)。请注意,范围可以是任何东西(例如1至5年或2至6年)。我在http://sqlfiddle.com/#!2/a65265/1

创建了一个sqlfiddle

我尝试过使用DIV并在论坛中搜索,但我能得到的最接近的是预定义的范围,如5-10岁,10-15岁等。我需要一个更通用的解决方案,适用于所有可能的年龄范围。

1 个答案:

答案 0 :(得分:6)

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

基本理念 -
每行重复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