SQL Server中排名函数row_number,rank,dense_rank,ntile详解
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函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号(是不是和自增量有些像)。下面我们用个示例来理解它:
先创建一个表:
(
SM money
)
然后往其中插入数据:
select 3500
union all
select 3500
union all
select 3200
union all
select 3000
union all
select 2000
union all
select 2000
再利用Row_Number生成不重复的序号:
得到结果:
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来指定输出结果的排序条件,那么结果还是会按我们指定的输出,比如:
得到结果:
id SM
5 2000.00
6 2000.00
4 3000.00
3 3200.00
1 3500.00
2 3500.00
2.Rank函数
该函数返回每行数据在结果集中的排名,如果有重复的排名,那么下一个排名与上一个排名就会断开,也就是不连续。这有点像我们读书时的成绩排名,实际上,它也在成绩,绩效等排名上用的非常多。
示例:
返回结果:
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函数是一样的,只是它返回每行数据在结果集中连续的排名.
示例:
返回结果:
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函数。
示例:
返回结果:
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详解的更多相关文章
- SQL Server:排名函数row_number,rank,dense_rank,ntile详解
1.Row_Number函数 row_number函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号 例如: select S ...
- SQL Server - 四种排序, ROW_NUMBER() /RANK() /DENSE_RANK() /ntile() over()
>>>>英文版 (更简洁易懂)<<<< 转载自:https://dzone.com/articles/difference-between-rownum ...
- SQL Server中通用数据库角色权限的处理详解
SQL Server中通用数据库角色权限的处理详解 前言 安全性是所有数据库管理系统的一个重要特征.理解安全性问题是理解数据库管理系统安全性机制的前提. 最近和同事在做数据库权限清理的事情,主要是删除 ...
- 转:SQL Server中服务器角色和数据库角色权限详解
当几个用户需要在某个特定的数据库中执行类似的动作时(这里没有相应的Windows用户组),就可以向该数据库中添加一个角色(role).数据库角色指定了可以访问相同数据库对象的一组数据库用户. 数据库角 ...
- 好用的排名函数~ROW_NUMBER(),RANK(),DENSE_RANK() 三兄弟
排名函数三兄弟,一看名字就知道,都是为了排名而生!但是各自有各自的特色!以下一个例子说明问题!(以下栗子没有使用Partition By 的关键字,整个结果集进行排序) RANK 每个值一个排名,同样 ...
- Spark2 Dataset分析函数--排名函数row_number,rank,dense_rank,percent_rank
select gender, age, row_number() over(partition by gender order by age) as rowNumber, ...
- SQL Server中COALESCE函数的用法
在SQL Server中COALESCE函数,会返回其参数中第一个不为NULL的参数,效果如下: SELECT COALESCE(NULL,NULL,N'A',NULL,NULL) 结果: SELEC ...
- Oracle中INSTR函数与SQL Server中CHARINDEX函数
Oracle中INSTR函数与SQL Server中CHARINDEX函数 1.ORACLE中的INSTR INSTR函数格式:INSTR(源字符串, 目标字符串, 起始位置, 匹配序号) 说明:返回 ...
- ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over() 今天女票问我SqlServer的四种排序,当场写了几句Sql让她了解,现把相关Sql放上来. 首先, ...
随机推荐
- RowFilter 对于已获取到的dataset进行过滤
原文发布时间为:2009-11-12 -- 来源于本人的百度文章 [由搬家工具导入] DataView的属性RowFilter使用方法 p.s. 重点在于DataView是DateTable相关联的一 ...
- updatepanel中使用alert弹出框方法
原文发布时间为:2009-05-17 -- 来源于本人的百度文章 [由搬家工具导入] ScriptManager.RegisterStartupScript(this.UpdatePa ...
- js4:with,for in语句,windows,location对象的使用
原文发布时间为:2008-11-08 -- 来源于本人的百度文章 [由搬家工具导入] <html> <head> <title>js</title> & ...
- java网络编程学习笔记(三):ServerSocket详解
1.ServerSocket的构造方法 ServerSocket(); ServerSocket(int port); ServerSocket(int port,int backlog); Serv ...
- C++调用Matlab引擎 图像读写与处理 (知识+代码篇)
准备知识 之 Matlab Engine 执行命令 /* Execute matlab statement */ int engEvalString(Engine* ep, const char* s ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---3
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...
- abstract抽象类和interface接口
一.抽象类 1.抽象类不能实例化,因为有抽象方法未实现 2.可以被抽象类或非抽象类继承 3.但不是只能被继承,还可以直接拿来使用的,当然,这个使用是拿来声明,反例如下: public abstract ...
- JS与jquery书写插件规范
什么是封装呢? 我的理解就是 把一个功能单独做成一个组件,就像做饺子,以前做饺子必须自己先用面粉做饺子皮,再做饺子馅,然后再手工包饺子,但是现在人们发明了自动包饺子机器,虽然机器里面的每一步骤和你自己 ...
- 转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类
在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能:第二需要设计实现一个s ...
- NIO、AIO学习历程
今天我们以一个常见的面试题作为开始:"谈谈你对IO与NIO的理解".要回答这个问题,我们首先我要了解几个概念: NIO 同步+非阻塞 IO(BIO) 同步+阻塞 AIO 异步+非阻 ...