【问题标题】:top n record of each group by active record rails每个组的前 n 条记录(按活动记录轨)
【发布时间】:2017-08-23 14:59:58
【问题描述】:

我有一个名为 result 的表,它有 source_id

id source_id text order
1  1         aaa  1
2  1         bbb  2
3  1         ccc  3
4  2         aaa  1
5  2         bbb  2
5  2         ccc  3

问题是如何通过 source_id 按每个组的顺序获取前 2 条记录顺序?结果应该是这样的

source_id  text  order
1          aaa   1
1          bbb   2
2          aaa   1
2          bbb   2

我尝试了这些查询,但没有一个有效

.group("source_id").order('order DESC').limit(30)

.group_by(&:source_id).map! { |source_id, latest_results_of_source| latest_results_of_source.limit(30)}

.group_by(&:source_id).map { |source_id, latest_results_of_source| latest_results_of_source.limit(30)}

.group_by(&:source_id).map { |source_id, latest_results_of_source| latest_results_of_source}

【问题讨论】:

  • 到目前为止你做了什么?
  • 我刚刚更新了我的问题

标签: ruby-on-rails activerecord


【解决方案1】:

我会这样做:

Result.find_by_sql("SELECT * FROM (SELECT ROW_NUMBER() OVER (PARTITION BY source_id ORDER BY order DESC) AS r, results.* FROM results) x WHERE x.r <= 2 ORDER BY order")

【讨论】:

  • @Arash jan 我有 mysql,但你的代码在那里不起作用:(
【解决方案2】:

你可以试试:

 Result.where(order:[1,2]).order(:source_id, :order)

【讨论】:

  • 为了便于阅读,我会将订单字段重命名为其他名称(例如 sort_order)
  • 你试过了吗?
  • 这不是我要找的,我不知道我需要将多少组放在 where 子句中。它应该是动态的
  • 它是动态的。您需要指定的唯一部分是您想要的任何顶部 n。 where(order:[1,2]) 与 where("results.order
猜你喜欢
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2016-07-15
  • 2021-09-01
相关资源
最近更新 更多