sql - 为什么我们需要 `order by` in row_number() over(按列名排序)?

标签 sql sql-server sql-order-by row-number

为什么我们应该在这个 t-sql 术语的 over 短语中使用“order by”:

row_number() over(order by column name)

最佳答案

如果您问为什么必须在 OVER CLAUSE 中放置 ORDER BY 子句(不仅仅是因为 ANSI 规范 需要它),您可能会认为这是多余的,因为它是除了将放置在整个 ORDER BY 子句之外的查询结束。

ORDER BYOVER() clause 中的用处是因为您可能希望将 ORDER BY 应用到整个查询,而不是在确定由分区 ROW_NUMBER() 生成的列时应用的排序功能。考虑以下查询,我们希望对城市 (PARTITION BY) 内的城市人口进行排名,但按国家名称和城市名称的字母顺序排列:

假设 City(CountryName, CityName, Population)

select CountryName, CityName, 
       ROW_NUMBER() OVER (PARTITION BY CountryName 
                          ORDER BY Population DESC) AS RankedPopulation
FROM City
ORDER BY CountryName, CityName;

可能会出现这样的结果:

CountryName     CityName       RankedPopulation
--------------- -------------- -----------------
England         Liverpool      2
England         London         1
France          Lyons          2
France          Paris          1
USA             Los Angeles    2
USA             Miami          3
USA             New York       1

如果您有多个从分析函数投影的列,则每一个列都可以在各自的 OVER 子句中具有独立的顺序。

请注意,在我上面的示例中,RANK would be a more appropriate choice than ROW_NUMBER - 我只是想保留您问题的上下文。

SqlFiddle of the example here

关于sql - 为什么我们需要 `order by` in row_number() over(按列名排序)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29575960/

相关文章:

mysql - SELECT DISTINCT 数据不同但未被过滤

sql - 查询不返回 bool 列设置为 FALSE 的记录?

sql - 将 xml 列中的数据插入临时表

sql - 如何将日期时间值从行转换为列

sql-server - 使用 REPAIR_ALLOW_DATA_LOSS 时丢失了哪些(类型)数据?

MySQL - 按日期排序,然后按标题整理

sql - 时态表中的日期函数

mysql - 在mysql表中实现外键

php - MySQL 没有正确排序数据

sql-server-2008 - SQL Server 中的 ORDER BY 子句