2016-11-15 3 views
3

У меня есть простая таблица mysql с именами и возрастными столбцами. Мне нужно найти возрастной диапазон (скажем, с длиной 5), который содержит наибольшее количество записей. Обратите внимание, что диапазон может быть от чего угодно до чего угодно (от 1 до 5 лет или от 2 до 6 лет). Я создал sqlfiddle для этого же на http://sqlfiddle.com/#!2/a65265/1Mysql найти диапазон с большинством элементов

Я пробовал использовать DIV и искал через форумы, но ближайший я могу получить, это предопределенные диапазоны, такие как возраст 5-10, 10-15 и т. Д. Мне нужен более общий решение для всех возможных возрастных диапазонов.

+0

Что такое возрастный диапазон с длиной 5? – Mihai

+0

любой диапазон длины 5. извините, не знал, как это сделать. например, возраст 0-5, 1-6, 2-7 и т. д. – pinaki

+1

@Mihai: Кажется, он хочет, чтобы все диапазоны от 5 до 1 были «MAX (age)». Как это много. –

ответ

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 
+0

ничего себе. я все еще пытаюсь понять запрос :). большое спасибо. очень признателен. – pinaki

+0

Помогите объяснить, как это работает? – DForck42

+0

@ DForck42, см. Отредактированный ответ. –

Смежные вопросы