SQL,如何按分数排序并获得有序列表中ID的位置

时间:2017-12-29 15:59:03

标签: sql

这就是我所拥有的:

SELECT * FROM scores WHERE userId ="${message.author.id}"

这将获得表格分数中userId ${message.author.id} {。}}的行。

我想用这个:

SELECT * FROM scores ORDER BY points

现在我不知道该怎么做。我想采用此有序列表,并使用userId的{​​{1}}获取行的位置。

所以我基本上想按每个用户的点数来订购表格,然后我想使用${message.author.id}来查看该用户所处的位置。

实施例

userId

当我使用它时:

userId   points
1         20
2         30
3         10
4         25

现在看起来应该是这样的:

SELECT * FROM scores ORDER BY points DESC

然后我想获得特定userId points 2 30 4 25 1 20 3 10 所在行的位置。所以,如果我得到userId行,我想要离开:3。

我该怎么做?感谢。

3 个答案:

答案 0 :(得分:0)

您需要一个排名函数,可以使用相关子查询来完成。

select userid,points,
(select count(distinct points) from scores where points >= s.points) as rnk
from scores s

然后查询所需的userId&#39>。

select rnk 
from (select userid,points,
      (select count(distinct points) from scores where points >= s.points) as rnk
      from scores s 
     ) t
where userid=1 --change this as required

如果您的dbms支持窗口函数,请使用dense_rank

select rnk
from (select userid,points,dense_rank() over(order by points desc) as rnk
      from scores s
     ) t
where userid=1

答案 1 :(得分:0)

您可以将以下内容用于SQL Server:

SELECT 
    ROW_NUMBER() OVER(ORDER BY points) AS RowId, * 
FROM 
    scores 
ORDER BY 
    points

答案 2 :(得分:0)

您可以使用ANSI标准窗口函数(row_number()rank())进行每个人的排名:

select s.*, rank() over (order by points desc) as ranking
from scores s;

rank()允许联系; row_number()给予不同但相邻排名的并列分数。)

对于特定用户:

select count(*) + 1
from scores s
where s.score > (select s2.score from scores s where s2.userId = @userId);