1

可能重复:
SQL:选择每个 GROUP BY 组中的第一行?

两个 SQL 表。一位参赛者有许多参赛作品:

Contestants     Entries
Id   Name       Id  Contestant_Id  Score
--   ----       --  -------------  -----
1    Fred       1   3              100
2    Mary       2   3              22
3    Irving     3   1              888
4    Grizelda   4   4              123
                5   1              19
                6   3              50

低分获胜。需要检索按分数排序的所有参赛者的当前最佳分数:

Best Entries Report
Name     Entry_Id  Score
----     --------  -----
Fred     5         19
Irving   2         22
Grizelda 4         123

我当然可以通过许多查询来完成这项工作。我的问题是是否有办法通过一个高效的 SQL 查询来获得结果。我几乎可以看到如何使用GROUP BY,但不完全是。

如果相关,环境是 Rails ActiveRecord 和 PostgreSQL。

4

5 回答 5

1

最简单的方法是使用排名函数:

select name, Entry_id, score
from (select e.*, c.name,
             row_number() over (partition by e.contestant_id order by score) as seqnum
      from entries e join
           contestants c
           on c.Contestant_id = c.id
     ) ec
where seqnum = 1
于 2012-12-02T21:09:33.867 回答
1

我不熟悉 PostgreSQL,但是这些方面的东西应该可以工作:

SELECT c.*, s.Score
FROM Contestants c
JOIN (SELECT MIN(Score) Score, Contestant_Id FROM Entries GROUP BY Contestant_Id) s
ON c.Id=s.Contestant_Id
于 2012-12-02T21:11:11.773 回答
1

解决方案之一是

select min(e.score),c.name,c.id from entries e
inner join contestants c on e.contestant_id = c.id
group by e.contestant_id,c.name,c.id

这是示例 http://sqlfiddle.com/#!3/9e307/27

于 2012-12-02T21:17:22.313 回答
1

这个简单的查询应该可以解决问题..

Select contestants.name as name, entries.id as entry_id,  MIN(entries.score) as score
FROM entries
JOIN contestants ON contestants.id = entries.contestant_id
GROUP BY name
ORDER BY score

这会获取每个参赛者的最低分数并命令他们 ASC

于 2012-12-02T21:18:27.307 回答
1

这是执行此操作的特定 postgresql 方式:

SELECT DISTINCT ON (c.id) c.name, e.id, e.score
FROM Contestants c
JOIN Entries e ON c.id = e.Contestant_id
ORDER BY c.id, e.score

有关的详细信息DISTINCT ON这里

我的SQLFiddle示例。

UPD 按分数排序结果:

SELECT *
FROM (SELECT DISTINCT ON (c.id) c.name, e.id, e.score
      FROM Contestants c
      JOIN Entries e ON c.id = e.Contestant_id
      ORDER BY c.id, e.score) t
ORDER BY score
于 2012-12-02T23:01:09.240 回答