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]

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

下面的语句将按降序对年收入数据进行排序。
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]

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