SQL SERVER 中窗口函数2 排名函数 ROW_NUMBER()、RANK()、DENSE_RANK()及NTILE()

  1.  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的重复性

  2.  ROW_NUMBER() OVER(PARTITION BY.. ORDER BY ..) 与 RANK() OVER(PARTITION BY.. ORDER BY ..)
    关键PARTTION BY 对字段进行分区,可以理解为GRPUP BY分组, 然后对在自己分区范围内通过后面的 ORDER BY 进行排序,
  3. 分区后内部的排序方式 ROW_NUMBER 是连续的,RANK() 可不连续。分区之间的排序没有任何关系,各分区各排序自己的数据。
    见下图:

  4.  DENSE_RANK()及NTILE() 
    ENSE_RANK RANK 都是不连续的排序,但是ENSE_RANK去重后是连续的, RANK去重后是不连续的(跳跃式)如下查询:


    NTILE(n) 后面n表示对排序后的结果总数Total进行平均分组,每组按1,2,3进行排序,见下图


     
  5.  在实际中的应用,
    需要查找订单不同手机销售价最高的型号及日期,其实就是根据手机型号分区后,在各个分区按最高价格DESC排序后,取各个分区后第一行
    的数据,可借助于CET 获取的最终结果值
     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值