SQL ROW_NUMBER

ROW_NUMBER 函数是排名函数之一。此 SQL Server row_number 函数为分区中的每个唯一行分配连续的排名编号。

如果 ROW_NUMBER 函数在同一分区中遇到两个相等的 A 值,它将为这两个值分配不同的排名编号。这里的排名编号将取决于它们显示的顺序。

SQL Server ROW_NUMBER 语法

ROW_NUMBER 函数的语法是

SELECT ROW_NUMBER() OVER (PARTITION_BY_Clause ORDER_BY_Clause)
FROM [Source]

Partition_By_Clause:将记录划分为分区。

  • 如果指定了 Partition By Clause,ROW_NUMBER 函数将为每个分区分配排名编号。
  • 如果未定义 Partition By,该函数会将所有记录视为一个分区。因此,它将从上到下分配排名编号。

对于此函数示例,我们使用之前提到的 Rank Table 数据。

SQL Server ROW_NUMBER 函数示例

此函数为分区中的每条记录分配行号或排名编号。在此 排名函数 示例中,我们展示了如何对 Server 表中的分区记录进行排名。

以下 row_number 查询将按职业分区数据,并使用年收入分配行号。

SELECT [FirstName]
      ,[LastName]
      ,[Education]
      ,[Occupation]
      ,[YearlyIncome]
      ,ROW_NUMBER() OVER (
                     PARTITION BY [Occupation] 
                     ORDER BY [YearlyIncome] DESC
             ) AS [ROW NUMBER]
  FROM [Customers]
ROW_NUMBER Example 1

在此示例查询中,以下语句使用职业将数据划分为分区。从上面可以看出,我们得到了四个分区。

PARTITION BY [Occupation]

在下面的语句中,我们使用了带有 Partition by 子句的 SQL ROW_NUMBER 函数。因此,它将为每个分区分配行号。

ROW_NUMBER() OVER (
              PARTITION BY [Occupation] 
              ORDER BY [YearlyIncome] DESC
             ) AS [ROW NUMBER]

尽管第 3 条和第 4 条记录的年收入相同(80000),但它们被赋予了不同的排名。因为 ROW_NUMBER 为每条记录分配不同的排名。

SQL Server ROW_NUMBER(不带 Partition By Clause)

此行号示例显示了如果我们遗漏了 ROW_NUMBER 函数中的 Partition By 会发生什么。例如,以下查询使用了上面没有 Partition by 子句的查询。

SELECT [FirstName]
      ,[LastName]
      ,[Education]
      ,[Occupation]
      ,[YearlyIncome]
      ,ROW_NUMBER() OVER (
                     ORDER BY [YearlyIncome] DESC
              ) AS [ROW NUMBER]
  FROM [Customers]
ROW_NUMBER FUNCTION without Partition By clause Exanple 2

下面的语句将按降序对年收入数据进行排序。

ORDER BY [YearlyIncome] DESC

在下面的语句中,我们使用了不带 Partition by 子句的 row_number 函数来获取行号。因此,Row number 函数会将它们视为一个分区,并从头到尾分配排名编号。

ROW_NUMBER() OVER (
              ORDER BY [YearlyIncome] DESC
            ) AS [ROW_NUMBER]

字符串列上的 ROW_NUMBER

它还允许您对字符串列进行排名。在此示例中,我们将使用 SQL ROW_NUMBER 函数为 [First name] 列分配排名编号。

SELECT [LastName]
      ,[Education]
      ,[YearlyIncome]
      ,[Occupation]
      ,[FirstName]
      ,ROW_NUMBER() OVER (
                    PARTITION BY [Occupation] 
                    ORDER BY [FirstName] DESC
                   ) AS [ROW NUMBER]
  FROM [Customers]
ROW_NUMBER FUNCTION on String Column 3

如果您观察上面的屏幕截图,尽管第 6 条和第 7 条记录的名字相同(John),但 Select 语句 为它们赋予了不同的行号。因为 SQL Server row number 会为列中的每条记录分配唯一的排名。

评论已关闭。