SQL Server计算排名

时间:2015-04-08 08:38:32

标签: sql-server function stored-procedures do-while

我有一张包含体育赛事结果的表格。 该表位于SQL Server 2012中。我正在寻找一种填充排名列的方法。

表格如下:

  • Player1 - Level1 - 30 Points
  • Player2 - 等级1 - 25分
  • Player3 - Level2 - 33 Points

    我想添加一个排名列,并根据玩家的积分和等级来计算。 (每个级别的排名从1开始) 在我的例子中,玩家1将位于第一位,玩家2位于第二位,玩家3位于第一位。

    如何构建循环遍历表并填充排名列的函数或过程?

  • 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