sqlserver排名函数
在做开发的时候,排名函数是sqlserver经常用到的函数,在分页的时候需要用,分组的时候也要用,主要排名函数有row-number,rank(),dense-rank(),NTILE()接下来详细说明其使用
1.row-number
作用:排序,实现分页
例如:
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY FDate DESC ) AS R ,
*
FROM dbo.FI_ProfitAndLoss
) AS A
WHERE R BETWEEN 1 AND 100;
结果如下:

注意:1、要使用over()子句选择对某一列进行排序才能生成序号,并实现排序。
2、over()子句中的order by 字段 要与sql排序记录中的order by 字段保持一致, 否则得到的序号可能不是连续的(序号不连续,比较乱)。
2.rank()
作用:用于返回结果集的分区内每行的排名
例如:
SELECT RANK() OVER ( ORDER BY FDate DESC ) AS R ,
FDate
FROM dbo.FI_ProfitAndLoss;
结果如下:

图中前十条记录的FDate相同,所以他们的序号是一样的,第11条记录的序号就是11,
注意:如果第一名和第二名的数据相同,则并列为第一名,接下来为第三名,为分组不连续排名。
3、dense-rank()
作用:与rank()基本一样,但生成的分组排名序号是连续的。
例如:
SELECT DENSE_RANK() OVER ( ORDER BY FDate DESC ) AS R ,
FDate
FROM dbo.FI_ProfitAndLoss;
结果如下

图中前十条记录的FDate相同,所以他们的序号是一样的,第11条记录的序号紧接上一个的序号,所以为2不为3,后面的依此类推
4、NTILE()
作用:ntile函数可以对序号进行分组处理,将有序分区中的行分发到指定数目的组中。 各个组有编号,编号从一开始。 对于每一个行,ntile 将返回此行所属的组的编号。这就相当于将查询出来的记录集放到指定长度的数组中,每一个数组元素存放一定数量的记录。ntile函数为每条记录生成的序号就是这条记录所有的数组元素的索引(从1开始)。也可以将每一个分配记录的数组元素称为“桶”。ntile函数有一个参数,用来指定桶数。下面的SQL语句使用ntile函数对FI_ProfitAndLoss表进行了装桶处理:
例如:
SELECT NTILE(6) OVER ( ORDER BY FDate DESC ) AS R ,
FDate
FROM dbo.FI_ProfitAndLoss WHERE companyid='';
结果如下:

如图,一共19条数据,分6组,第一组4条数据,其他五组都是3条数据 。
1、每组的记录数不能大于它上一组的记录数,即编号小的桶放的记录数不能小于编号大的桶。也就是说,第1组中的记录数只能大于等于第2组及以后各组中的记录数。
2、所有组中的记录数要么都相同,要么从某一个记录较少的组(命名为X)开始后面所有组的记录数都与该组(X组)的记录数相同。也就是说,如果有个组,前三组的记录数都是9,而第四组的记录数是8,那么第五组和第六组的记录数也必须是8。
总结:
在使用排名函数的时候需要注意以下三点:
1、排名函数必须有 OVER 子句。
2、排名函数必须有包含 ORDER BY 的 OVER 子句。
3、分组内从1开始排序。
sqlserver排名函数的更多相关文章
- MSSQL sqlserver系统函数教程分享
		
摘要: 下文收集了sqlserver函数教程,为每一个函数都进行了相关举例说明, 如下所示: sqlserver聚合函数教程: mssql sqlserver avg聚合函数使用简介 mssql sq ...
 - SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数
		
Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下: ...
 - sqlserver的over开窗函数(与排名函数或聚合函数一起使用)
		
首先初始化表和数据 create table t_student( Id INT, Name varchar(), Score int, ClassId INT ); insert i ...
 - sqlserver数据库安全函数、配置函数、游标函数、行级函数、排名函数、元数据函数、系统统计函数 、文本和图像函数--收藏着有用
		
行级函数:下列行集函数将返回一个可用于代替 Transact-SQL 语句中表引用的对象. CONTAINSTABLE 返回具有零行.一行或多行的表,这些行的列中包含的基于字符类型的数据是单个词语和短 ...
 - 你真的会玩SQL吗?表表达式,排名函数
		
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
 - sql server 排名函数:DENSE_RANK
		
一.需求 之前sql server 的排名函数用得最多的应该是RoW_NUMBER()了,我通常用ROW_NUMBER() + CTE 来实现分页:今天逛园,看到另一个内置排名函数还不错,自己顺便想了 ...
 - SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较
		
排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: .row_number .rank .dense_rank .ntile 下面分别介绍一下这四个 ...
 - 好用的排名函数~ROW_NUMBER(),RANK(),DENSE_RANK() 三兄弟
		
排名函数三兄弟,一看名字就知道,都是为了排名而生!但是各自有各自的特色!以下一个例子说明问题!(以下栗子没有使用Partition By 的关键字,整个结果集进行排序) RANK 每个值一个排名,同样 ...
 - T-SQL排名函数
		
提到排名函数我们首先可能想到的是order by,这个是排序,不是排名,排名需要在前面加个名次序号的,order by是没有这个功能的.还可能会想到identity(1,1),它也给了一个序号,但是不 ...
 
随机推荐
- 关于diskgenius删除所有分区后,电脑不能识别U盘的问题。
			
楼主曾今为了将Linux系统安装至U盘中,曾无数次对U盘进行过格式化,到最后导致,u盘各种引导.系统.烂数据存在U盘,导致U盘的使用越来越不方便.后来终于下狠心,利用diskgenius对U盘进行一次 ...
 - Java——poi读取Excel文件
			
1.创建文件流,打开EXCEL文件 FileInputStream excelFile = new FileInputStream(excelPath); XSSFWorkbook workbook ...
 - 用dwz时, 由于粗心产生的一些问题(记录方便自己查阅)
			
在打开"添加" 或 "修改" , 用dialog弹出时 , 点击提交的时候, dialog 不能关闭, 也不能刷新 解决办法: 注意form标签, onsubm ...
 - How To Install Spring IDE In Eclipse
			
Spring IDE is a very useful graphical user interface tool adding support for Spring Framework. In th ...
 - docker-compose搭建单机多节点es + kibana
			
docker-compose.yml配置如下: version: '2.2' services: elasticsearch: image: docker.elastic.co/elasticsear ...
 - NGUI中显示DrawCall详细信息
			
[NGUI显示DrawCall详细信息] UIDrawCall中有个宏,SHOW_HIDDEN_OBJECTS,默认为关闭状态.将此宏打开,NGUI即会将DrawCall对象显示在Hierarchy中 ...
 - MySQL学习2---索引
			
MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引和组合索引.单列索引,即一个索引只包含单个列,一个表可以有多个单列索引, ...
 - 745. Prefix and Suffix Search 查找最大index的单词
			
[抄题]: Given many words, words[i] has weight i. Design a class WordFilter that supports one function, ...
 - 单词的添加与查找 · Add and Search Word
			
[抄题]: 设计一个包含下面两个操作的数据结构:addWord(word), search(word) addWord(word)会在数据结构中添加一个单词.而search(word)则支持普通的单词 ...
 - 1-为什么java的main方法必须是静态的
			
为什么java的main方法必须是静态的 今天看类型信息时发现一个问题,不能再main方法中打印this关键字的信息,这时想起了之前的知识,不能再静态方法中调用this.理由很简单,this表示“ ...