SQL RANK() 与 ROW_NUMBER(): 差异详解
在 SQL 中,RANK() 和 ROW_NUMBER() 功能相似,容易混淆。然而,理解它们细微的差别对于有效的数据操作至关重要。
RANK() 与 ROW_NUMBER() 的比较
RANK() 为分区内具有相同排序值的行列分配相同的排名,而 ROW_NUMBER() 始终递增,即使对于具有相同值的行列也是如此。
关键差异:处理重复值
RANK() 和 ROW_NUMBER() 之间的主要区别在于它们在遇到分区内重复值时的行为:
示例
考虑以下表格:
StyleID | ID | Description |
---|---|---|
1 | 1 | Item A |
1 | 1 | Item B |
1 | 1 | Item C |
1 | 2 | Item D |
使用以下查询:
<code class="language-sql">SELECT ID, Description, RANK() OVER (PARTITION BY StyleID ORDER BY ID) AS 'Rank' FROM SubStyle; SELECT ID, Description, ROW_NUMBER() OVER (PARTITION BY StyleID ORDER BY ID) AS 'RowNumber' FROM SubStyle;</code>
只有在分区内没有重复值时,才能获得相同的结果。例如,如果您添加另一行,其中 StyleID 为 3,ID 为 1,您将观察到以下结果:
StyleID | ID | Description | Rank | RowNumber |
---|---|---|---|---|
1 | 1 | Item A | 1 | 1 |
1 | 1 | Item B | 1 | 2 |
1 | 1 | Item C | 1 | 3 |
1 | 2 | Item D | 4 | 4 |
3 | 1 | New Item | 1 | 5 |
如您所见,对于 StyleID 为 3 的唯一值,ROW_NUMBER() 分配递增的数字,而 RANK() 为其分配与 StyleID 为 1 的重复值行相同的排名。
结论
RANK() 和 ROW_NUMBER() 服务于不同的目的。RANK() 用于对组内的唯一值进行排名,适当地处理重复值。另一方面,ROW_NUMBER() 始终递增,确保每一行都有一个不同的数值,即使对于重复值的行也是如此。在使用 SQL 数据时,理解这些差异对于做出明智的决策至关重要。
以上是SQL RANK() 与 ROW_NUMBER():它们在处理关系时有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!