提问人:Kenzie 提问时间:9/19/2008 更新时间:9/6/2017 访问量:6180
从列表中获取每个帐户 ID 的一行
Fetch one row per account id from list
问:
我有一个包含游戏分数的表,允许每个帐户 ID 多行:。我想要一个前 10 名得分手 ID 及其分数的列表。scores (id, score, accountid)
你能提供一个sql语句来选择前10个分数,但每个账户ID只有一个分数吗?
谢谢!
答:
2赞
Danimal
9/19/2008
#1
试试这个:
select top 10 username,
max(score)
from usertable
group by username
order by max(score) desc
评论
1赞
zigdon
9/19/2008
“前 10 名”是新的吗?我不记得以前看过吗?
0赞
Danimal
9/19/2008
依赖于 DBMS -- 它是 2000 年 SQL Server 的新增功能
1赞
Neall
9/19/2008
#2
PostgreSQL 有 DISTINCT ON 子句,其工作方式如下:
SELECT DISTINCT ON (accountid) id, score, accountid
FROM scoretable
ORDER BY score DESC
LIMIT 10;
不过,我不认为这是标准的SQL,所以希望其他数据库以不同的方式做到这一点。
4赞
zigdon
9/19/2008
#3
select username, max(score) from usertable group by username order by max(score) desc limit 10;
2赞
Eclipse
9/19/2008
#4
首先,将选择限制为每个帐户 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
评论
0赞
Kenzie
9/21/2008
事实证明,这似乎更好,因为它选择了整行。另一个 max 查询仅将 max 分数附加到每个 accountid 的随机行。
0赞
Kenzie
9/21/2008
修复:SELECT * FROM scores s1 WHERE accountid NOT IN (SELECT accountid FROM scores s2 WHERE s1.accountid = s2.accountid and s1.score < s2.score) ORDER BY score DESC
2赞
Kenzie
9/25/2008
我在这个查询中唯一剩下的问题是,当该帐户有不止一次出现其最高分时,我每个帐户ID都会获得不止一行。因此,如果 accoundid 6 的分数为 50、75、40、75,则查询将返回分数为 75 的两行。
1赞
John Fiala
9/21/2008
#5
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赞
orbitaudio
7/23/2009
#6
我相信PostgreSQL(至少8.3)将要求表达式必须与初始表达式匹配。即当你有 .要解决此问题,请将其添加到:DISTINCT ON
ORDER BY
DISTINCT ON (accountid)
ORDER BY score DESC
ORDER BY
SELECT DISTINCT ON (accountid) *
FROM scoretable
ORDER BY accountid, score DESC
LIMIT 10;
使用此方法可以选择表中的所有列。即使存在重复的 score “max” 值,它也只会为每个 accountid 返回 1 行。
这对我来说很有用,因为我没有找到最高分数(使用 max() 函数很容易做到),但最近一次为 accountid 输入了分数。
评论