为什么我们应该在这个 t-sql 术语的 over 短语中使用“order by”:
row_number() over(order by column name)
最佳答案
如果您问为什么必须在 OVER CLAUSE
中放置 ORDER BY
子句(不仅仅是因为 ANSI 规范
需要它),您可能会认为这是多余的,因为它是除了将放置在整个 ORDER BY
子句之外的查询结束。
ORDER BY
在OVER()
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
- 我只是想保留您问题的上下文。
关于sql - 为什么我们需要 `order by` in row_number() over(按列名排序)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29575960/