SQL 服务器计算排名
SQL Server Calculate Ranking
我有一份 table 的体育赛事结果。
table 在 SQL Server 2012 中。我正在寻找一种方法来填充排名列。
table 就像:
玩家 1 - 等级 1 - 30 分
Player2 - Level1 - 25 分
玩家 3 - 等级 2 - 33 分
我想添加一个带有排名的列,并根据玩家的积分和水平来计算。 (每级排名从 1 开始)
在我的示例中,玩家 1 将排在第一位,玩家 2 排在第二位,玩家 3 排在第一位。
如何构建循环遍历 table 并填充排名列的函数或过程?
您可以使用 rank() or dense_rank() 函数:
SELECT *
,RANK() OVER (PARTITION BY [level] ORDER BY Points DESC)
FROM MyTable
您可以使用DENSE_RANK()
window函数:
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。
尝试:
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
我有一份 table 的体育赛事结果。 table 在 SQL Server 2012 中。我正在寻找一种方法来填充排名列。
table 就像:
我想添加一个带有排名的列,并根据玩家的积分和水平来计算。 (每级排名从 1 开始) 在我的示例中,玩家 1 将排在第一位,玩家 2 排在第二位,玩家 3 排在第一位。
如何构建循环遍历 table 并填充排名列的函数或过程?
您可以使用 rank() or dense_rank() 函数:
SELECT *
,RANK() OVER (PARTITION BY [level] ORDER BY Points DESC)
FROM MyTable
您可以使用DENSE_RANK()
window函数:
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。
尝试:
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