从列表中为每个帐户ID提取一行

时间:2020-03-06 14:22:35  来源:igfitidea点击:

我有一张带有游戏分数的表格,每个帐户ID允许多行:得分(ID,分数,帐户ID)。我想要列出前10名得分手ID及其得分的列表。

我们能否提供一条sql语句来选择前10个得分,但每个帐户ID仅得分一个?

谢谢!

解决方案

试试这个:

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

PostgreSQL具有DISTINCT 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;

首先,将每个帐户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

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表达式匹配。 IE。如果我们具有ORDER BY score DESC,则不能使用DISTINCT ON(帐户)。要解决此问题,请将其添加到" ORDER BY"中:

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

使用此方法可以选择表中的所有列。即使存在重复的"最大"值,每个帐户ID只会返回1行。

这对我很有用,因为我没有找到最大分数(使用max()函数很容易做到),但是最近一次为accountid输入分数。