Sql Server2005 4个排名函数: RANK(),DENSE_RANK(),ROW_NUMBER(),NTILE()
--演示例题,建一个table
create table rankorder(
orderid int,
qty int
)
go
--插入数据
insert rankorder values(30,10)
insert rankorder values(10,10)
insert rankorder values(80,10)
insert rankorder values(40,10)
insert rankorder values(30,15)
insert rankorder values(30,20)
insert rankorder values(22,20)
insert rankorder values(21,20)
insert rankorder values(10,30)
insert rankorder values(30,30)
insert rankorder values(40,40)
go
--查询出各类排名
SELECT orderid,qty,
ROW_NUMBER() OVER(ORDER BY qty) AS rownumber,
RANK() OVER(ORDER BY qty) AS [rank],
DENSE_RANK() OVER(ORDER BY qty) AS denserank ,
NTILE(3) OVER(ORDER BY qty) AS [NTILE]
FROM rankorder
ORDER BY qty
--结果
--ROW_NUMBER()是按qty由小到大逐一排名,不并列,排名连续
--RANK()是按qty由小到大逐一排名,并列,排名不连续
--DENSE_RANK()是按qty由小到大逐一排名,并列,排名连续
--NTILE()是按qty由小到大分成3组逐一排名,并列,排名连续
orderid qty rownumber rank denserank NTILE
30 10 1 1 1 1
10 10 2 1 1 1
80 10 3 1 1 1
40 10 4 1 1 1
30 15 5 5 2 2
30 20 6 6 3 2
22 20 7 6 3 2
21 20 8 6 3 2
10 30 9 9 4 3
30 30 10 9 4 3
40 40 11 11 5 3
sql 2005实现排名非常方便,但是用sql 2000实现排名就比较麻烦,下面是sql 2000的实现代码:
--RANK在sql 2000中的实现
select orderid,qty,
(select count(1)+1 from rankorder where qty<r.qty) as [rank]
from rankorder r
ORDER BY qty
go
--ROW_NUMBER在sql 2000中的实现
--利用临时表和IDENTITY(函数)
select identity(int,1,1) as [ROW_NUMBER],orderid,qty
into #tem
from rankorder
select orderid,qty,[ROW_NUMBER]
from #tem
drop table #tem
go
--DENSE_RANK在sql 2000中的实现
select identity(int,1,1) as ids, qty
into #t
from rankorder
group by qty
order by qty
select r.orderid,r.qty,t.ids as [DENSE_RANK]
from rankorder r join #t t
on r.qty=t.qty
drop table #t
go
排名函数是与窗口函数OVER()配合一起使用的。
如果借助OVER子句的参数PARTITION BY,就可以将结果集分为多个分区。排名函数将在每个分区内进行排名.
--例题
SELECT orderid,qty,
DENSE_RANK() OVER(ORDER BY qty) AS a ,
DENSE_RANK() OVER(PARTITION BY orderid ORDER BY qty) AS b
FROM rankorder
ORDER BY qty
--说明:
--a列是在全部记录上进行的排名
--b列是把orderid中的记录分成了10,21,22,30,40,80这6个区,再在每个区上进行的排名。
orderid qty a b
10 10 1 1
30 10 1 1
40 10 1 1
80 10 1 1
30 15 2 2
30 20 3 3
21 20 3 1
22 20 3 1
10 30 4 2
30 30 4 4
40 40 5 2
我们看到排名函数可以很简便的得到各种类型的排名
以下是我对4个排名函数的类比表格:
排名连续性 排名并列性
RANK() 不一定连续 有并列
DENSE_RANK() 连续 有并列
ROW_NUMBER() 连续 无并列
NTILE() 连续 有并列
分享到:
相关推荐
排名函数是SQL Server2005新加的功能。在SQL Server2005中有如下四个排名函数row_number、rank、dense_rank和ntile,需要的朋友可以参考下。
MS SQL 2005 四个排序函数ROW_NUMBER、RANK、DENSE_RANK 和 NTILE简介用法结果排名排序
主要介绍了sql四大排名函数之ROW_NUMBER、RANK、DENSE_RANK、NTILE使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
博客文章地址:http://blog.csdn.net/pfe_nova/article/details/41357435 SQL2005之后添加的几个排名函数以及透析与反透析关键字,主要有Row_Number、RANK、DENSE_RANK、NTILE函数,pivot以及unpivot关键字
Sql Server 2005 引入了4个新的排名函数:ROW_NUMBER、BANK、DENSE_RANK和NTILE。
2 Oracle开发专题之:分析函数 Rank Dense rank row number 3 Oracle开发专题之:分析函数3 Top Bottom N First Last NTile 4 Oracle开发专题之:窗口函数 5 Oracle开发专题之:报表函数 6 Oracle开发专题之:...
SQL2005增加了4个关于队计算的函数:分别是ROW_NUMBER,RANK,DENSE_RANK,NTILE. 注意:这些函数只能出现在SELECT和ORDER BY的查询中。语法如下: ranking_function over([partition by col_list] order by col_...
在前面《Oracle开发之分析函数(Rank、Dense_rank、row_number)》一文中,我们已经知道了如何为一批记录进行全排列、分组排列。假如被排列的数据中含有空值呢? 代码如下:SQL> select region_id, customer_id, ...
select s.id, s.name, cid, c.name, row_number() over(partition by c.name order by s.id) as rank from student s, classes c where cid = c.id; select s.id, s.name, cid, c.name, rank() over(partition by...
作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...