为什么我们应该使用"命令"在这个t-sql术语的过度短语中:
row_number() over(order by column name)
答案 0 :(得分:7)
如果您问为什么必须在OVER CLAUSE
中放置ORDER BY
子句(除了ANSI spec
要求它之外),您可能认为这是多余的它是整个ORDER BY
子句的补充,它将放在查询的末尾。
ORDER BY
中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
如果您从分析函数投影了多个列,则每个列可以在相应的{{1}}子句中具有独立的排序。
请注意,在上面的示例中,OVER()
clause - 我只想保留您问题的背景。
答案 1 :(得分:1)
来自MSDN
<强> 强> 定义每个分区内行的逻辑顺序 结果集。也就是说,它指定了逻辑顺序 窗口函数计算被执行。
答案 2 :(得分:1)
Row_Number实际上使用了这种情况: 假设我们有这个记录(5,3,4,1,6) 在行号中我们说存在多少元素,它们的值低于当前元素?要回答这个问题,我们需要有一个有序的清单。如果不是,我们需要在整个列表中进行迭代以找出实际数量。