我想找到解决现实问题的不同方法:想象一下比赛或比赛,用户收集积分。您必须构建一个查询以显示具有最佳“n”分数的用户列表。
我正在做一个澄清的例子。假设这是用户表,其中包含获得的积分:
UserId - Points
1 - 100
2 - 75
3 - 50
4 - 50
5 - 50
6 - 25
如果我想要前三名,结果将是:
UserId - Points
1 - 100
2 - 75
3 - 50
4 - 50
5 - 50
这可以在视图或存储过程中实现,如您所愿。我的目标数据库是Sql Server。实际上我解决了这个问题,但我认为有不同的方法来获得结果...比我的更快或更有效率。
答案 0 :(得分:10)
未经测试,但应该有效:
select * from users where points in
(select distinct top 3 points from users order by points desc)
答案 1 :(得分:4)
这是一个有效的 - 我不知道它是否更有效,它是SQL Server 2005 +
with scores as (
select 1 userid, 100 points
union select 2, 75
union select 3, 50
union select 4, 50
union select 5, 50
union select 6, 25
),
results as (
select userid, points, RANK() over (order by points desc) as ranking
from scores
)
select userid, points, ranking
from results
where ranking <= 3
显然第一个“with”是设置值,所以你可以测试第二个,最后选择工作 - 你可以从“结果为......”开始,如果你查询现有的表。
答案 2 :(得分:1)
怎么样:
select top 3 with ties points
from scores
order by points desc
不确定“with ties”是否适用于SQL Server以外的任何其他内容。
在SQL Server 2005及更高版本上,您可以将“top”数字作为int参数传递:
select top (@n) with ties points
from scores
order by points desc
答案 3 :(得分:1)
实际上,使用INNER JOIN对WHERE IN进行修改会更快。
SELECT
userid, points
FROM users u
INNER JOIN
(
SELECT DISTINCT TOP N
points
FROM users
ORDER BY points DESC
) AS p ON p.points = u.points
答案 4 :(得分:0)
@bosnic,我认为这不会按要求工作,我不熟悉MS SQL,但我希望它只返回3行,而忽略3个用户并列第3位的事实。
这样的事情应该有效:
select userid, points
from scores
where points in (select top 3 points
from scores
order by points desc)
order by points desc
答案 5 :(得分:0)
@Espo感谢现实检查 - 添加了子选择来纠正它。
我认为最简单的回应是:
select userid, points from users
where points in (select distinct top N points from users order by points desc)
如果你想把它放在以N作为参数的存储过程中,那么你要么必须将SQL读入变量然后执行它,要么执行行计数技巧:
declare @SQL nvarchar(2000)
set @SQL = "select userID, points from users "
set @SQL = @SQL + " where points in (select distinct top " + @N
set @SQL = @SQL + " points from users order by points desc)"
execute @SQL
或
SELECT UserID, Points
FROM (SELECT ROW_NUMBER() OVER (ORDER BY points DESC)
AS Row, UserID, Points FROM Users)
AS usersWithPoints
WHERE Row between 0 and @N
击> <击> 撞击> 这两个示例都假定SQL Server并且尚未经过测试。
答案 6 :(得分:0)
@罗布#37760:
select top N points from users order by points desc
如果N为3,此查询将仅选择3行,请参阅问题。 “前三名”应该返回5行。
答案 7 :(得分:0)
@Matt Hamilton
您的答案适用于上面的示例,但如果数据集为100,75,75,50,50(其中只返回3行)则不起作用。 TOP WITH TIES仅包括返回的最后一行的关系...
答案 8 :(得分:0)
Crucible得到它(假设SQL 2005是一个选项)。
答案 9 :(得分:0)
试试这个
select top N points from users order by points desc
答案 10 :(得分:0)
嘿,我发现所有其他答案都有点长而且效率低下 我的回答是:
select * from users order by points desc limit 0,5
这将呈现前5分