仅显示最高价值的用户条目

only show highest value user entry

我正在创建一个用户可以提交多个条目的竞赛。只会显示吨位最高的条目。在索引视图中,所有条目都必须根据吨位值降序排列。

我的提交控制器显示如下:

@submissions = @contest.submissions.maximum(:tonnage, group: User)

这里的问题是我没有得到包含所有提交值的数组。我需要一些我可以迭代的东西。

例如一个列表,其中仅包含来自用户的一个提交,即具有最高吨位值的提交。

当我刚分组时出现以下错误:

GroupingError: ERROR:  column "submissions.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "submissions".* FROM "submissions"  WHERE "submission...

更新:

我找到了一个 sql 查询,它的功能大致符合我的要求。

select * 
from submissions a
inner join
  ( select user_id, max(tonnage) as max_tonnage
    from submissions
    group by user_id) b 
on
a.user_id = b.user_id and
a.tonnage = b.max_tonnage

如何在 activerecord 中解决这个问题?

评论信息:

使用 DISTINCT ON 更简单:

SELECT DISTINCT ON (user_id) * 
FROM   submissions
ORDER  BY user_id, tonnage DESC NULLS LAST;

NULLS LAST 只有当吨位可以为 NULL 时才相关:
详细解释:

  • Select first row in each GROUP BY group?

ActiveRecord 中的语法:

Submission.select("DISTINCT ON (user_id) *").order("user_id, tonnage DESC NULLS LAST")

More in the Ruby documentation 或此相关答案:

  • Get a list of first record for each group

可能的性能优化:

  • Optimize GROUP BY query to retrieve latest record per user

对结果行进行排序

根据评论中的要求。

SELECT * FROM (
   SELECT DISTINCT ON (user_id) * 
   FROM   submissions
   ORDER  BY user_id, tonnage DESC NULLS LAST
   ) sub
ORDER  BY tonnage DESC NULLS LAST, user_id;  -- 2nd item to break ties;

或者在子查询中使用 row_number()

SELECT * FROM (
   SELECT *
        , row_number() OVER (PARTITION BY user_id ORDER BY tonnage DESC NULLS LAST) AS rn
   FROM   submissions
   ) sub
WHERE  rn = 1
ORDER  BY tonnage DESC NULLS LAST, user_id;

或者你的查询,加上ORDER BY.