【发布时间】:2010-09-10 19:55:51
【问题描述】:
我有一个包含游戏分数的表格,每个帐户 ID 允许多行:scores (id, score, accountid)。我想要一份前 10 名得分手 ID 及其得分的列表。
你能提供一个sql语句来选择前10个分数,但每个帐户id只有一个分数吗?
谢谢!
【问题讨论】:
我有一个包含游戏分数的表格,每个帐户 ID 允许多行:scores (id, score, accountid)。我想要一份前 10 名得分手 ID 及其得分的列表。
你能提供一个sql语句来选择前10个分数,但每个帐户id只有一个分数吗?
谢谢!
【问题讨论】:
试试这个:
select top 10 username,
max(score)
from usertable
group by username
order by max(score) desc
【讨论】:
我相信 PostgreSQL(至少 8.3)将要求 DISTINCT ON 表达式必须匹配初始 ORDER BY 表达式。 IE。当你有ORDER BY score DESC 时,你不能使用DISTINCT ON (accountid)。要解决此问题,请将其添加到 ORDER BY:
SELECT DISTINCT ON (accountid) *
FROM scoretable
ORDER BY accountid, score DESC
LIMIT 10;
使用此方法可以选择表中的所有列。即使 score 有重复的“max”值,它也只会为每个 accountid 返回 1 行。
这对我很有用,因为我没有找到最高分数(使用 max() 函数很容易做到),而是最近一次为 accountid 输入了分数。
【讨论】:
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' 而不是那个 order by - 我手头没有我的 SQL 参考。
【讨论】:
首先将选择限制为每个帐户 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 username, max(score) from usertable group by username order by max(score) desc limit 10;
【讨论】:
PostgreSQL 有 DISTINCT ON 子句,以这种方式工作:
SELECT DISTINCT ON (accountid) id, score, accountid
FROM scoretable
ORDER BY score DESC
LIMIT 10;
虽然我不认为它是标准 SQL,所以希望其他数据库以不同的方式执行它。
【讨论】: