- ROW_NUMBER() OVER(ORDER BY..)与RANK() OVER(ORDER BY..)
是对OVER()中进行字段进行排序,ROW_NUMBER 的排序是不重复的,而RANK排序是可重复的
原表数据
现在下面语句查询结果:
SELECT *, ROW_NUMBER() OVER(ORDER BY ProductPrice) AS Numbers FROM OrderInfo
SELECT *, RANK() OVER(ORDER BY ProductPrice) AS Ranks FROM OrderInfo
我们可以看出 ROW_NUMBER()的排序的连续性,RANK的重复性 - ROW_NUMBER() OVER(PARTITION BY.. ORDER BY ..) 与 RANK() OVER(PARTITION BY.. ORDER BY ..)
关键PARTTION BY 对字段进行分区,可以理解为GRPUP BY分组, 然后对在自己分区范围内通过后面的 ORDER BY 进行排序, - 分区后内部的排序方式 ROW_NUMBER 是连续的,RANK() 可不连续。分区之间的排序没有任何关系,各分区各排序自己的数据。
见下图: - DENSE_RANK()及NTILE()
ENSE_RANK 和 RANK 都是不连续的排序,但是ENSE_RANK去重后是连续的, RANK去重后是不连续的(跳跃式)如下查询:
NTILE(n) 后面n表示对排序后的结果总数Total进行平均分组,每组按1,2,3进行排序,见下图
- 在实际中的应用,
需要查找订单不同手机销售价最高的型号及日期,其实就是根据手机型号分区后,在各个分区按最高价格DESC排序后,取各个分区后第一行
的数据,可借助于CET 获取的最终结果值
SQL SERVER 中窗口函数2 排名函数 ROW_NUMBER()、RANK()、DENSE_RANK()及NTILE()
最新推荐文章于 2024-08-06 23:39:07 发布