2015-09-30 52 views
3

我有一個模型,其中包含字段「日期」和「頻率」(頻率是整數)。我試圖獲得每個日期的前5個頻率。 本質上我想按日期分組,然後獲得每組的前5名。在Ruby on Rails中獲取每組最多N個項目

我迄今只有該組中獲取最高的1:

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

我想MAX(頻率)加上第二,第三,第四和第五大每個日期。

對不起,如果這很簡單,或者我的術語是關閉的;我剛開始使用Rails :)

+0

您使用的數據庫是? – romainsalles

+0

@romainsalles - > mysql – orrymr

+0

我認爲這更多的是SQL問題。請參閱mysql中的'''ROW_NUMBER()''函數(http://stackoverflow.com/questions/1895110/row-number-in-mysql),並將其與「find_by_sql」ActiveRecord方法(http:// apidock.com/rails/ActiveRecord/Base/find_by_sql/class)。您應該能夠確定適當的請求以按日期檢索您最常見的5個觀察值。 – 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