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

时间:2015-04-11 08:52:36

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

为什么我们应该使用"命令"在这个t-sql术语的过度短语中:

row_number() over(order by column name)

3 个答案:

答案 0 :(得分:7)

如果您问为什么必须在OVER CLAUSE中放置ORDER BY子句(除了ANSI spec要求它之外),您可能认为这是多余的它是整个ORDER BY子句的补充,它将放在查询的末尾。

ORDER BYORDER 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

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

请注意,在上面的示例中,OVER() clause - 我只想保留您问题的背景。

RANK would be a more appropriate choice than ROW_NUMBER

答案 1 :(得分:1)

来自MSDN

  

<强>   定义每个分区内行的逻辑顺序   结果集。也就是说,它指定了逻辑顺序   窗口函数计算被执行。

答案 2 :(得分:1)

Row_Number实际上使用了这种情况: 假设我们有这个记录(5,3,4,1,6) 在行号中我们说存在多少元素,它们的值低于当前元素?要回答这个问题,我们需要有一个有序的清单。如果不是,我们需要在整个列表中进行迭代以找出实际数量。