DENSE_RANK,相同值共用排名值,接着排DENSE_RANK函数与RANK函数的语法和效果类似,区别就像函数名称中的DENSE(紧密的)含义一样,如果碰到相同的字段值,虽然都会使用相同的排名序列值,但序列值是连续的 。
其语法格式如下:
dense_rank() over(order by field列表 asc|desc)下面我们就实战一下:
select DENSE_RANK() over(order by FAmount desc) as FRank,* from @sale;运行效果如下图所示:
文章插图
可以看出RANK和DENSE_RANK确实有共同点,但也有区别 。RANK排名值如果碰到相同字段值,则会使用相同的排名值,后续会跳过断开使用新的排名值;DENSE_RANK碰到相同字段值同样使用相同的排名值,但是接着排下来,不会断开 。
NTILE,根据约定分组NTILE函数的语法和用途上面三个明显不同,其功能主要用来实现对记录进行分组 。根据NTILE约定分组的组数,将查询结果按照over子句的排序标准进行分组,分组组号按照序列排列,同一个组使用同一个组号 。
其语法格式如下:
ntile(组数) over(order by field列表 asc|desc)如果指定的组数刚好实现均分,则每一组的记录数是相同的,比如我们将8条记录分成四组,则会有四个组,组号分别是1、2、3、4,每一组都会有两个记录,举例如下:
select NTILE(4) over(order by FAmount desc) as FRank,* from @sale;运行效果如下:
文章插图
如果分成五组,明显无法均分,那如何分呢?
当然是有一种逻辑存在的 。这种逻辑可以这样理解,从第一组开始,使用总记录数除以组数,获取等于或最大于相除结果的最小整数,作为第一组的记录条数;剩余的记录条数按照相同算法依次类推 。通俗来讲,NTITLE在优先配足靠前的分组的记录数的前提下,尽量进行均分 。
下面我们我实战将以上记录分成五组的执行情况:
select NTILE(5) over(order by FAmount desc) as FRank,* from @sale;运行效果如下:
文章插图
从上图可以看出,记录条数是8条,分成5组,我们用8除以5,最接近且大于等于的整数是2,第一组占用了两条记录,这时候还剩余6条记录分4组;依次类推,6除以4,最接近且大于等于的整数是2,第二组还是2条记录;此时剩余4条记录要分3组,4除以3,最接近且大于等于的整数还是2;再往下,剩余两条分两组,这时候就刚好均分了 。
需要明确的是,NTILE也可用来分页,但因分组逻辑的原因,效果就不如ROW_NUMBER理想了 。
推荐阅读
- 在既有系统中打通Apache Ignite、MySQL和Node.js
- 国产汽车十大排名 国产汽车标志图片大全
- 发型|全球十大好用爽肤水 迪蕾排名第一, 第四在非洲很畅销
- 外媒评最佳手机TOP10 手机排名前十名
- 2020橱柜品牌排名 实木橱柜品牌最新排行榜
- CRUD MySQL数据库必会的增删查改操作
- 护肤|2022年效果排名护肤品套装 太适合国人肌肤了 让肌肤水嫩又亮白
- 保湿|抗皱祛斑紧致精华十大排名
- 勐海排名前十的茶厂
- 环保橱柜十大品牌排名