SQL Server中排名函数row_number,rank,dense_rank,ntile详解

从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:
1.row_number
2.rank
3.dense_rank
4.ntile

下面我们对这四个函数一一进行讲解

1.Row_Number函数
可能row_number函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号(是不是和自增量有些像)。下面我们用个示例来理解它:

先创建一个表:

create table Salary
(
SM money
)

然后往其中插入数据:

insert into Salary1(SM) 
select 3500
union all
select 3500
union all
select 3200
union all
select 3000
union all
select 2000
union all
select 2000

再利用Row_Number生成不重复的序号:

select SM,row_number() over(order by SM desc) as ID from salary

得到结果:
ID SM
1 3500.00
2 3500.00
3 3200.00
4 3000.00
5 2000.00
6 2000.00

可以看到,结果中生成了一列不重复的序号ID列。

么SQL语句中的over(order by SM desc)是什么呢?这里是指定生成序号的依据,要生成不重复的序号,那么那行的序号最大?那么的序
号最小?就是由over条件来指定的。order by SM desc就是告诉SQL,应该按照SM列中值从大到小的顺序生成ID列,实际
上,row_number函数的原理就是先用over子句中的排序条件对记录进行排序,然后再按着这个顺序生成序号。如果SM中有重复的值,我们还可以使
用多列来指定依据,比如order by SM1,SM2 Desc。如果没有其它列,那么SQL会依据自己的内部规则来对重复的行进行排序。

注意:over条件中的order by 与 SQL中排序条件order by不冲突。over中的order by仅是生成序号的排序条件,如果我们在sql后面使用order by来指定输出结果的排序条件,那么结果还是会按我们指定的输出,比如:

select row_number() over(order by SM desc) as id,SM from salary order by sm asc

得到结果:
id SM
5 2000.00
6 2000.00
4 3000.00
3 3200.00
1 3500.00
2 3500.00

2.Rank函数
该函数返回每行数据在结果集中的排名,如果有重复的排名,那么下一个排名与上一个排名就会断开,也就是不连续。这有点像我们读书时的成绩排名,实际上,它也在成绩,绩效等排名上用的非常多。
示例:

select rank() over(order by SM desc) as id,SM from salary

返回结果:
id SM
1 3500.00
1 3500.00
3 3200.00
4 3000.00
5 2000.00
5 2000.00

over条件与Row_Number函数一样。

3.dense_rank函数
我们使用Rank函数得到了不连续的排名,那么如果我们需要连续的排名的时候怎么办呢?呵呵,聪明的你应该已经猜到了,就是使用dense_rank函数,dense_rank函数的用法与Rank函数是一样的,只是它返回每行数据在结果集中连续的排名.
示例:

select Dense_rank() over(order by SM desc) as id,SM from salary

返回结果:
id SM
1 3500.00
1 3500.00
2 3200.00
3 3000.00
4 2000.00
4 2000.00

4.ntile函数
ntile函数可以将结果集放到我们指定数目的组中。比如我们的测试表salary中有6行数据,现在我们要将这6行数据按照salary值的从大到小的顺序分成4组,那么我们就可以用ntile函数。
示例:

select ntile(4) over(order by SM desc) as id, SM from salary

返回结果:
id SM
1 3500.00
1 3500.00
2 3200.00
2 3000.00
3 2000.00
4 2000.00

可以看到,salary的结果被分成4组了,id中的值,就是每行数据所在的组号(在msdn教程中把"组"称之为"桶",但我认为,叫成"组"更有利于我们理解)。

但是,nitle是根据什么依据来分组我们的数据呢?上面的结果中,为什么前两组中有两条数据,而后两组中只有一条数据呢?这就要了解分组的两个依据:
1,每组的记录数不能大于它上一组的记录数
2,所有组中的记录要么都相同,要么从某组开始后面所有组的记录数都与该组的记录数相同。这个理解比较抽象了,大家可以在实例中慢慢理解

SQL Server中排名函数row_number,rank,dense_rank,ntile详解的更多相关文章

  1. SQL Server:排名函数row_number,rank,dense_rank,ntile详解

    1.Row_Number函数 row_number函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号 例如: select S ...

  2. SQL Server - 四种排序, ROW_NUMBER() /RANK() /DENSE_RANK() /ntile() over()

    >>>>英文版 (更简洁易懂)<<<< 转载自:https://dzone.com/articles/difference-between-rownum ...

  3. SQL Server中通用数据库角色权限的处理详解

    SQL Server中通用数据库角色权限的处理详解 前言 安全性是所有数据库管理系统的一个重要特征.理解安全性问题是理解数据库管理系统安全性机制的前提. 最近和同事在做数据库权限清理的事情,主要是删除 ...

  4. 转:SQL Server中服务器角色和数据库角色权限详解

    当几个用户需要在某个特定的数据库中执行类似的动作时(这里没有相应的Windows用户组),就可以向该数据库中添加一个角色(role).数据库角色指定了可以访问相同数据库对象的一组数据库用户. 数据库角 ...

  5. 好用的排名函数~ROW_NUMBER(),RANK(),DENSE_RANK() 三兄弟

    排名函数三兄弟,一看名字就知道,都是为了排名而生!但是各自有各自的特色!以下一个例子说明问题!(以下栗子没有使用Partition By 的关键字,整个结果集进行排序) RANK 每个值一个排名,同样 ...

  6. Spark2 Dataset分析函数--排名函数row_number,rank,dense_rank,percent_rank

    select gender,       age,       row_number() over(partition by gender order by age) as rowNumber,    ...

  7. SQL Server中COALESCE函数的用法

    在SQL Server中COALESCE函数,会返回其参数中第一个不为NULL的参数,效果如下: SELECT COALESCE(NULL,NULL,N'A',NULL,NULL) 结果: SELEC ...

  8. Oracle中INSTR函数与SQL Server中CHARINDEX函数

    Oracle中INSTR函数与SQL Server中CHARINDEX函数 1.ORACLE中的INSTR INSTR函数格式:INSTR(源字符串, 目标字符串, 起始位置, 匹配序号) 说明:返回 ...

  9. ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()

    ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()   今天女票问我SqlServer的四种排序,当场写了几句Sql让她了解,现把相关Sql放上来. 首先, ...

随机推荐

  1. 【HDOJ5558】Alice's Classified Message(后缀数组)

    题意:给定一个长度为n的下标从0开始的小写字母字符串,每次对于当前的i寻找一个j使得后缀i与后缀j的lcp最大,(j<i)若lcp相同则取较小的 若lcp为0则输出0与当前字符,i自增1,否则输 ...

  2. 利用C#原有函数对数组进行降序排列

    原文发布时间为:2009-03-04 -- 来源于本人的百度文章 [由搬家工具导入] 利用 Array类的静态方法 Sort可以对数组进行升序排列。如下:       Array.Sort(数组名); ...

  3. soc与cpu区别

    soc(System on Chip)片上系统cpu只包括运算器和控制器.早期 的系统是指在PCB上有cpu和Nand控制器,LCD控制器之类的控制器,构成一个系统. cpu和这些控制器之间用pcb板 ...

  4. django + gunicorn + supervisor

    在服务器上跑着一个Django项目,想用supervisor管理起来,遇到一个小问题,记录一下本来启动Django项目的命令是用的manage.py ,  但是这中方法有个很神奇的坑,就是ctrl + ...

  5. hdu 3061 hdu 3996 最大权闭合图 最后一斩

    hdu 3061 Battle :一看就是明显的最大权闭合图了,水提......SB题也不说边数多少....因为开始时候数组开小了,WA....后来一气之下,开到100W,A了.. hdu3996. ...

  6. SpringBoot第十一篇:SpringBoot+MyBatis+Thymelaf实现CRUD

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10936304.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   总结前面几 ...

  7. 基于ARP的网络扫描工具netdiscover

    基于ARP的网络扫描工具netdiscover   ARP是将IP地址转化物理地址的网络协议.通过该协议,可以判断某个IP地址是否被使用,从而发现网络中存活的主机.Kali Linux提供的netdi ...

  8. luogu P3147 [USACO16OPEN]262144

    题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small to ...

  9. linux基础学习7

      Linux 的开机流程分析 1. 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置: 2. 读取并执行第一个开机装置内 MBR 的 boot Loader (亦即是 gr ...

  10. Jsp2.0自定义标签(第三天)——EL表达式的使用

    1.提出问题: 我们经常会看到这样的jsp页面代码: 浏览器显示: 为什么会在页面输出:Hello World  ,${per}究竟是如何找到“Hello World”的呢? 2.分析问题: 要想解决 ...