Sql server SQL Server计算排名

Sql server SQL Server计算排名,sql-server,function,stored-procedures,do-while,Sql Server,Function,Stored Procedures,Do While,我有一张体育比赛成绩表。 该表位于SQL Server 2012中。我正在寻找一种方法来填补排名栏 该表如下所示: 球员1-1级-30分 球员2-1级-25分 球员3-2级-33分 我想添加一个列与排名和计算的基础上,积分和球员的水平。(每个级别的排名从1开始) 在我的示例中,玩家1将位于第一位,玩家2位于第二位,玩家3位于第一位 如何构建一个在表格上循环并填充排名列的函数或过程?您可以使用或函数: SELECT * ,RANK() OVER (PARTITION BY [level

我有一张体育比赛成绩表。 该表位于SQL Server 2012中。我正在寻找一种方法来填补排名栏

该表如下所示:
  • 球员1-1级-30分
  • 球员2-1级-25分
  • 球员3-2级-33分

    我想添加一个列与排名和计算的基础上,积分和球员的水平。(每个级别的排名从1开始) 在我的示例中,玩家1将位于第一位,玩家2位于第二位,玩家3位于第一位

    如何构建一个在表格上循环并填充排名列的函数或过程?

    您可以使用或函数:

    SELECT *
          ,RANK() OVER (PARTITION BY [level] ORDER BY Points DESC)
    FROM MyTable
    

    您可以使用
    densite\u 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分配给播放器1,
    rnk
    =2分配给播放器2,
    rnk
    =3分配给播放器3

    如果在平局的情况下,例如玩家2得到30分,你希望玩家3的
    rnk
    为3,那么你应该使用
    RANK
    而不是
    densite\u RANK

    另一方面,如果您希望按
    级别
    划分排名,则使用
    分区依据
    子句:

    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
    

    从一个角度来看,这很好,但如果两名球员的得分相同,这是否有可能跳过一个位置?通常,当两名玩家都排在第一位时,第二位会被跳过。如果您希望这两名玩家都有1个作为rnk,第三名玩家有3个作为rnk,那么只需使用
    RANK
    而不是
    densite\u RANK
    。很好,我可以把它也写到表中,以便以后在报告中使用吗?@Jan我认为最好的选择是创建一个包含排名窗口函数的视图,然后在报告中使用此视图。