从列表中为每个帐户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输入分数。