SQL Server中排名函数row_number,rank,dense_rank,ntile详解
支持大型的数据库。可以处理拥有上千万条记录的大型数据库。从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)操作之前的数据状态原文。 如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。 如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录. 习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。 代替了原来VB式的错误判断。比Oracle高级不少。 Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。 varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。 对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。 其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
页:
[1]