仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 797|回复: 8
打印 上一主题 下一主题

[学习教程] SQL Server中排名函数row_number,rank,dense_rank,ntile详解

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
支持大型的数据库。可以处理拥有上千万条记录的大型数据库。从SQLSERVER2005入手下手,SQLSERVER新增了四个排名函数,分离以下:
1.row_number
2.rank
3.dense_rank
4.ntile

上面我们对这四个函数逐一举行解说

1.Row_Number函数
大概row_number函数人人对照熟习一些,由于它的用处十分的普遍,我们常常在分页与排序顶用到它,它的功效就是在每行中天生一个一连的不反复的序号(是否是和自增量有些像^_^)。上面我们用个示例来了解它:

先创立一个表:
createtableSalary
(
SMmoney
)

然后往个中拔出数据:
insertintoSalary1(SM)
select3500
unionall
select3500
unionall
select3200
unionall
select3000
unionall
select2000
unionall
select2000

再使用Row_Number天生不反复的序号:
selectSM,row_number()over(orderbySMdesc)asIDfromsalary

失掉了局:
IDSM
13500.00
23500.00
33200.00
43000.00
52000.00
62000.00

能够看到,了局中天生了一列不反复的序号ID列。
那末SQL语句中的over(orderbySMdesc)是甚么呢?这里是指定天生序号的根据,要天生不反复的序号,那末那行的序号最年夜?那末的序号最小?就是由over前提来指定的。orderbySMdesc就是告知SQL,应当依照SM列中值从年夜到小的按次天生ID列,实践上,row_number函数的道理就是先用over子句中的排序前提对纪录举行排序,然后再按着这个按次天生序号。假如SM中有反复的值,我们还可使用多列来指定根据,好比orderbySM1,SM2Desc。假如没有别的列,那末SQL会根据本人的外部划定规矩来对反复的行举行排序。

注重:over前提中的orderby与SQL中排序前提orderby不抵触。over中的orderby仅是天生序号的排序前提,假如我们在sql前面利用orderby来指定输入了局的排序前提,那末了局仍是会按我们指定的输入,好比:
selectrow_number()over(orderbySMdesc)asid,SMfromsalaryorderbysmasc

失掉了局:
idSM
52000.00
62000.00
43000.00
33200.00
13500.00
23500.00

2.Rank函数
该函数前往每行数据在了局会合的排名,假如有反复的排名,那末下一个排名与上一个排名就会断开,也就是不一连。这有点像我们念书时的成就排名,实践上,它也在成就,绩效等排名上用的十分多。
示例:
selectrank()over(orderbySMdesc)asid,SMfromsalary

前往了局:
idSM
13500.00
13500.00
33200.00
43000.00
52000.00
52000.00

over前提与Row_Number函数一样。

3.dense_rank函数
我们利用Rank函数失掉了不一连的排名,那末假如我们必要一连的排名的时分怎样办呢?呵呵,伶俐的你应当已猜到了,就是利用dense_rank函数,dense_rank函数的用法与Rank函数是一样的,只是它前往每行数据在了局会合一连的排名.
示例:
selectDense_rank()over(orderbySMdesc)asid,SMfromsalary

前往了局:
idSM
13500.00
13500.00
23200.00
33000.00
42000.00
42000.00

4.ntile函数
ntile函数能够将了局集放到我们指定命目标组中。好比我们的测试表salary中有6行数据,如今我们要将这6行数据依照salary值的从年夜到小的按次分红4组,那末我们就能够用ntile函数。
示例:
selectntile(4)over(orderbySMdesc)asid,SMfromsalary

前往了局:
idSM
13500.00
13500.00
23200.00
23000.00
32000.00
42000.00

能够看到,salary的了局被分红4组了,id中的值,就是每行数据地点的组号(在msdn教程中把"组"称之为"桶",但我以为,叫成"组"更有益于我们了解)。

可是,nitle是依据甚么根据来分组我们的数据呢?下面的了局中,为何前两组中有两条数据,尔后两组中只要一条数据呢?这就要懂得分组的两个根据:
1,每组的纪录数不克不及年夜于它上一组的纪录数
2,一切组中的纪录要末都不异,要末从某组入手下手前面一切组的纪录数都与该组的纪录数不异。这个了解对照笼统了,人人能够在实例中渐渐了解

到此,SQLSERVER中的排名函数我们就逐一解说完了,假如有不合错误或漏掉的部分,接待人人指出。恢复到之前的某个状态,是需要数据的。这数据可以是a)回滚步骤或者b)操作之前的数据状态原文。
分手快乐 该用户已被删除
沙发
发表于 2015-1-18 12:11:05 | 只看该作者
如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。
小魔女 该用户已被删除
板凳
发表于 2015-1-26 15:44:42 | 只看该作者
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
兰色精灵 该用户已被删除
地板
发表于 2015-2-4 20:38:06 | 只看该作者
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。
因胸联盟 该用户已被删除
5#
 楼主| 发表于 2015-2-10 09:19:50 | 只看该作者
代替了原来VB式的错误判断。比Oracle高级不少。
小女巫 该用户已被删除
6#
发表于 2015-3-1 09:21:05 | 只看该作者
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
简单生活 该用户已被删除
7#
发表于 2015-3-10 16:14:03 | 只看该作者
varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。
admin 该用户已被删除
8#
发表于 2015-3-17 09:08:39 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
谁可相欹 该用户已被删除
9#
发表于 2015-3-24 05:05:16 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-6 06:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表