为什么我们需要在row_number()中使用`order by`(按列名称排序)?

Meh*_*ost 1 sql sql-server row-number sql-order-by

为什么我们应该在这个t-sql术语中使用"order by"替换短语:

row_number() over(order by column name)
Run Code Online (Sandbox Code Playgroud)

Stu*_*tLC 8

如果你问为什么必须将ORDER BY子句放在OVER CLAUSE(除了因为ANSI spec需要它)之外,你可能认为这是多余的,因为除了ORDER BY将放在查询末尾的整个子句之外.

的用处ORDER BYOVER()条款是因为你可能希望应用不同的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;
Run Code Online (Sandbox Code Playgroud)

这可能会产生如下结果:

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
Run Code Online (Sandbox Code Playgroud)

如果您从分析函数中投影了多个列,则每个列都可以在相应的OVER子句中具有独立的排序.

在我上面的例子中注意,RANK将是一个更合适的选择ROW_NUMBER - 我只想保留你的问题的上下文.

这里的例子是SqlFiddle