2015-09-30 3 views
3

У меня есть модель с полями «дата» и «частота» (частота - целое число). Я пытаюсь получить 5 лучших частот в день. По существу я хочу группировать по дате, а затем получить 5 лучших за группу.Получить верхние N элементов в группе в Ruby on Rails

То, что я до сих пор только извлекает верхний 1 в группе:

Observation.channel("channelOne").order('date', 'frequency desc').group(:date).having('frequency = MAX(frequency)') 

Я хочу MAX (частота) плюс второй, третий, четвертый и пятый по величине для каждой даты.

Извините, если это действительно просто или моя терминология выключена; Я только начал с рельсами :)

+0

В какой базе данных у вас есть? – romainsalles

+0

@romainsalles -> mysql – orrymr

+0

Я думаю, что это больше проблема SQL. См. Функцию '' '' ROW_NUMBER() '' 'в mysql (http://stackoverflow.com/questions/1895110/row-number-in-mysql) и объедините ее с методом ActiveRecord« find_by_sql »(http: // apidock.com/rails/ActiveRecord/Base/find_by_sql/class). Вы должны иметь возможность определить соответствующий запрос для получения пяти наиболее частых наблюдений по дате. – romainsalles

ответ

2

Вы можете использовать это:

Observation 
    .select("obs1.*") 
    .from("observations obs1") 
    .joins("LEFT JOIN observations AS obs2 ON obs1.date = obs2.date AND obs1.frequency <= obs2.frequency") 
    .group("obs1.date, obs1.id") 
    .having("count(*) <= 5") 
    .order("obs1.date, obs2.frequency") 

Этот запрос возвращает первые 5 частот для каждой даты.

+0

Спасибо! Вопрос: Это упорядочивает частоты в порядке возрастания. Я нуждаюсь в них в нисходящем, чтобы получить верхнюю 5. Я пробовал .order («obs1.date, obs2.frequency desc») (догадка), которая не сработала. Также - не могли бы вы указать мне на учебник по этому поводу? Это было бы очень полезно :) – orrymr

+0

@orrymr, я использовал этот ответ как ресурс: http://stackoverflow.com/a/12114175/740394 – Rodrigo

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