Mysql找到大多数元素的范围

pin*_*aki 3 mysql sql

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

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

Dav*_*itz 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
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)

  • @pinaki,见编辑的答案. (2认同)