2008-09-18 71 views
6

我有一个表格,包含游戏分数,允许每个帐户ID有多行:scores (id, score, accountid)。我想要一个排名前10的记分员ID和他们的分数。从列表中为每个帐户ID获取一行

你可以提供一个sql语句来选择前10个分数,但每个账户id只有一个分数吗?

谢谢!

+0

我们在做你的功课吗? – paulwhit 2008-09-18 18:02:25

+4

家庭作业与否,这个问题是好的恕我直言,因为一个简单的DISTINCT不会工作,它需要将它与一个聚合函数结合起来 - 这个问题我也偶然发现了几次,在SO上有一个解决方案会使我们所有人受益。 – 2008-09-21 04:09:01

回答

2

首先将选择限制为每个帐户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 
2

试试这个:

select top 10 username, 
       max(score) 
from usertable 
group by username 
order by max(score) desc 
+1

是“最佳10”吗?我不记得以前看过吗? – zigdon 2008-09-18 17:56:45

+0

取决于数据库管理系统 - 这是2000年的SQL Server新手 – Danimal 2008-09-18 17:57:54

1

的PostgreSQL具有鲜明的ON子句,这种方式工作:

SELECT DISTINCT ON (accountid) id, score, accountid 
FROM scoretable 
ORDER BY score DESC 
LIMIT 10; 

我不认为这是标准SQL的,所以希望其他数据库做不同。

4
select username, max(score) from usertable group by username order by max(score) desc limit 10; 
1
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参考。

0

我相信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输入了一个分数。

相关问题