仅显示最高价值的用户条目
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
.
我正在创建一个用户可以提交多个条目的竞赛。只会显示吨位最高的条目。在索引视图中,所有条目都必须根据吨位值降序排列。
我的提交控制器显示如下:
@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
.