我有一张包含体育赛事结果的表格。 该表位于SQL Server 2012中。我正在寻找一种填充排名列的方法。
表格如下:
我想添加一个排名列,并根据玩家的积分和等级来计算。 (每个级别的排名从1开始) 在我的例子中,玩家1将位于第一位,玩家2位于第二位,玩家3位于第一位。
如何构建循环遍历表并填充排名列的函数或过程?
答案 0 :(得分:0)
您可以使用rank()或dense_rank()功能:
SELECT *
,RANK() OVER (PARTITION BY [level] ORDER BY Points DESC)
FROM MyTable
答案 1 :(得分:0)
您可以使用DENSE_RANK()
窗口功能:
SELECT Player, Level, Points,
DENSE_RANK() OVER ( ORDER BY CASE WHEN Level = 'Level1' THEN 1
WHEN Level = 'Level2' THEN 2
END,
Points DESC) AS rnk
FROM Players
以上内容会将rnk
= 1分配给Player1,将rnk
= 2分配给Player2,将rnk
= 3分配给Player3。
如果出现平局,例如Player2有30分,你想让Player3为rnk
为3,那么你应该使用RANK
代替DENSE_RANK
。
另一方面,如果您希望按Level
分区排名,请使用PATITION BY
子句:
SELECT Player, Level, Points,
DENSE_RANK() OVER ( PARTITION BY Level
ORDER BY Points DESC) AS rnk
FROM Players
以上内容会将rnk
= 1分配给Player1,将rnk
= 2分配给Player2,将rnk
= 1分配给Player3。
答案 2 :(得分:0)
尝试:
DECLARE @Levels TABLE
(
Level NVARCHAR(MAX) ,
Ranking INT
)
DECLARE @Players TABLE
(
Player NVARCHAR(MAX) ,
Level NVARCHAR(MAX) ,
Point INT
)
INSERT INTO @Levels
VALUES ( 'Level1', 1 ),
( 'Level2', 2 )
INSERT INTO @Players
VALUES ( 'Player1', 'Level1', 30 ),
( 'Player2', 'Level1', 25 ),
( 'Player3', 'Level2', 33 )
SELECT p.Player, p.Level, p.Point ,
DENSE_RANK() OVER ( ORDER BY l.Ranking, p.Point DESC ) AS Rank
FROM @Players p
JOIN @Levels l ON l.Level = p.Level
ORDER BY Rank
输出:
Player Level Point Rank
Player1 Level1 30 1
Player2 Level1 25 2
Player3 Level2 33 3