在Ruby on Rails中每组获取前N个项目

7
我有一个模型,它包含“日期”和“频率”字段(频率是整数)。我想要每个日期的前五个最高频率。 基本上,我想按日期分组,然后获取每个组的前五个。 到目前为止,我只能检索出每个组中的前1个。
Observation.channel("channelOne").order('date', 'frequency desc').group(:date).having('frequency = MAX(frequency)')

我想要每天的最大频率加上第二、第三、第四和第五大的频率。很抱歉如果这很简单或者我的术语不正确;我刚开始学习Rails :)

你使用哪个数据库? - romainsalles
@romainsalles -> mysql - orrymr
我认为这更像是一个SQL问题。请参考mysql中的ROW_NUMBER()函数(https://dev59.com/enI-5IYBdhLWcg3wW3Cp),并将其与“find_by_sql” ActiveRecord方法(http://apidock.com/rails/ActiveRecord/Base/find_by_sql/class)相结合。您应该能够确定适当的请求以按日期检索前5个最频繁的Observations。 - romainsalles
我更偏向于Postgres,无法测试这个请求,但我认为类似于以下内容可能有效:Observation.find_by_sql("SELECT date, frequency FROM ( SELECT frequency, date AS created_at, id, ROW_NUMBER() OVER (PARTITION BY date ORDER BY date DESC, frequency DESC) AS rank FROM observations where channel = 'channelOne' ) AS o WHERE rank <= 5 ORDER BY date DESC, frequency DESC ") - romainsalles
1个回答

6
您可以使用这个:
 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个频率。

谢谢!问题:这将频率按升序排序。我需要它们按降序排列,以便我可以获得前5个。我尝试了.order("obs1.date, obs2.frequency desc")(猜测),但没有成功。另外 - 你能指点我一下相关教程吗?非常感谢 :) - orrymr
@orrymr,我将此响应用作资源:https://dev59.com/Ymct5IYBdhLWcg3wa8s_#12114175 - Rodrigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接