我有一个表格,包含游戏分数,允许每个帐户ID有多行:scores (id, score, accountid)
。我想要一个排名前10的记分员ID和他们的分数。从列表中为每个帐户ID获取一行
你可以提供一个sql语句来选择前10个分数,但每个账户id只有一个分数吗?
谢谢!
我有一个表格,包含游戏分数,允许每个帐户ID有多行:scores (id, score, accountid)
。我想要一个排名前10的记分员ID和他们的分数。从列表中为每个帐户ID获取一行
你可以提供一个sql语句来选择前10个分数,但每个账户id只有一个分数吗?
谢谢!
首先将选择限制为每个帐户ID的最高分数。 然后拿到前十的分数。
SELECT TOP 10 AccountId, Score
FROM Scores s1
WHERE AccountId NOT IN
(SELECT AccountId s2 FROM Scores
WHERE s1.AccountId = s2.AccountId and s1.Score > s2.Score)
ORDER BY Score DESC
的PostgreSQL具有鲜明的ON子句,这种方式工作:
SELECT DISTINCT ON (accountid) id, score, accountid
FROM scoretable
ORDER BY score DESC
LIMIT 10;
我不认为这是标准SQL的,所以希望其他数据库做不同。
select username, max(score) from usertable group by username order by max(score) desc limit 10;
SELECT accountid, MAX(score) as top_score
FROM Scores
GROUP BY accountid,
ORDER BY top_score DESC
LIMIT 0, 10
这应该在MySQL正常工作。有可能你可能需要使用'ORDER BY MAX(score)DESC'而不是这个顺序 - 我手边没有我的SQL参考。
我相信PostgreSQL(至少8.3)将要求DISTINCT ON
表达式必须匹配最初的ORDER BY
表达式。 I.E.当你有ORDER BY score DESC
时,你不能使用DISTINCT ON (accountid)
。为了解决这个问题,将其添加到ORDER BY
:
SELECT DISTINCT ON (accountid) *
FROM scoretable
ORDER BY accountid, score DESC
LIMIT 10;
使用这种方法,您可以选择表中的所有列。即使存在重复的“最大”值,它也只会返回每行一行。
这对我很有用,因为我没有找到最高分数(max()函数很容易做到这一点),但最近一次为accountid输入了一个分数。
我们在做你的功课吗? – paulwhit 2008-09-18 18:02:25
家庭作业与否,这个问题是好的恕我直言,因为一个简单的DISTINCT不会工作,它需要将它与一个聚合函数结合起来 - 这个问题我也偶然发现了几次,在SO上有一个解决方案会使我们所有人受益。 – 2008-09-21 04:09:01