row_number()、rank()、dense_rank()、ntile()
原文:row_number()、rank()、dense_rank()、ntile()
SQL2005中row_number()等函数的用法
2005比2000新增了几个函数,分别是row_number()、rank()、dense_rank()、ntile(),下面以实例分别简单讲解一下。


create table gg(sname varchar(10),sort varchar(10),num int)
go
insert into gg
select '白芍','根茎类',55
union all
select '法半夏','根茎类',78
union all
select '柴胡','根茎类',60
union all
select '川芎','根茎类',99
union all
select '天香炉','草类',68
union all
select '灯心草','草类',55
union all
select '龙葵','草类',60
union all
select '石见穿','草类',60
union all
select '猪笼草','草类',70
union all
select '益母草','草类',86
union all
select '扁豆','果实类',86
union all
select '草果','果实类',70
union all
select '金樱子','果实类',55
union all
select '女贞子','果实类',94
union all
select '胖大海','果实类',66
union all
select '桑葚','果实类',78
select sname,sort,num,
row_number() over(order by num) as rownum,
rank() over(order by num) as ranknum,
dense_rank() over(order by num) as dersenum,
ntile(3) over(order by num) as ntilenum
from gg
--结果
--ROW_NUMBER()是按num由小到大逐一排名,不并列,排名连续
--RANK()是按num由小到大逐一排名,并列,排名不连续
--DENSE_RANK()是按num由小到大逐一排名,并列,排名连续
--NTILE()是按num由小到大分成组逐一排名,并列,排名连续
sname sort num rownum ranknum dersenum ntilenum
-------- --------- --------- ------------- ------------- --------------- ---------------
白芍 根茎类 55 1 1 1 1
灯心草 草类 55 2 1 1 1
金樱子 果实类 55 3 1 1 1
龙葵 草类 60 4 4 2 1
石见穿 草类 60 5 4 2 1
柴胡 根茎类 60 6 4 2 1
胖大海 果实类 66 7 7 3 2
天香炉 草类 68 8 8 4 2
草果 果实类 70 9 9 5 2
猪笼草 草类 70 10 9 5 2
法半夏 根茎类 78 11 11 6 2
桑葚 果实类 78 12 11 6 3
益母草 草类 86 13 13 7 3
扁豆 果实类 86 14 13 7 3
女贞子 果实类 94 15 15 8 3
川芎 根茎类 99 16 16 9 3
(16 行受影响)


select sname,sort,num,
row_number() over(partition by sort order by num) as rownum,
rank() over(partition by sort order by num) as ranknum,
dense_rank() over(partition by sort order by num) as dersenum,
ntile(3) over(partition by sort order by num) as ntilenum
from gg
--结果
此时加了partition by sort,就以类别来分类了,ntile(3)意思就是强制分为三组。
sname sort num rownum ranknum dersenum ntilenum
-------- ---------- --------- ------------- --------------- ---------------- -----------
灯心草 草类 55 1 1 1 1
龙葵 草类 60 2 2 2 1
石见穿 草类 60 3 2 2 2
天香炉 草类 68 4 4 3 2
猪笼草 草类 70 5 5 4 3
益母草 草类 86 6 6 5 3
白芍 根茎类 55 1 1 1 1
柴胡 根茎类 60 2 2 2 1
法半夏 根茎类 78 3 3 3 2
川芎 根茎类 99 4 4 4 3
金樱子 果实类 55 1 1 1 1
胖大海 果实类 66 2 2 2 1
草果 果实类 70 3 3 3 2
桑葚 果实类 78 4 4 4 2
扁豆 果实类 86 5 5 5 3
女贞子 果实类 94 6 6 6 3
(16 行受影响)
下面分别用SQL 2000实现,相对比2005要麻烦的多了。
--ROW_NUMBER在sql 2000中的实现
--利用临时表和IDENTITY(函数)


select sname,num,identity(int,1,1) as rownumber
into #tem
from gg
order by num
select sname,num,rownumber
from #tem
drop table #tem
go
--RANK在sql 2000中的实现
select sname,num,
(select count(1)+1 from gg where num<g.num) as ranknum
from gg g
order by num
go
--DENSE_RANK在sql 2000中的实现
select num,identity(int,1,1) as densenum
into #t
from gg
group by num
order by num
select r.sname,r.num,t.densenum
from gg r join #t t
on r.num=t.num
order by num
drop table #t
go
row_number()、rank()、dense_rank()、ntile()的更多相关文章
- SQL 序号列ROW_NUMBER,RANK,DENSE_RANK、NTILE
原文:SQL 序号列ROW_NUMBER,RANK,DENSE_RANK.NTILE SQL 2005新增加相关函数 : ROW_NUMBER,RANK,DENSE_RANK.NTILE 窗口函数 O ...
- Hive分析窗体函数之NTILE,ROW_NUMBER,RANK和DENSE_RANK
開始,依照顺序,生成分组内记录的序列–比方,依照pnum降序排列.生成分组内每天的pnum名次ROW_NUMBER() 的应用场景许多.再比方,获取分组内排序第一的记录等等. SELECT polno ...
- Oracle 排序分析函数之ROW_NUMBER、RANK和DENSE_RANK
我们都知道分析函数功能很强大,可能需要写很复杂的标准SQL才能办到或不可能办到的事,使用分析函数却能很容易完成.我们经常会用到排序分析函数,如ROW_NUMBER,RANK,DENSE_RANK.这三 ...
- SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较
排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: .row_number .rank .dense_rank .ntile 下面分别介绍一下这四个 ...
- 四个排名函数(row_number、rank、dense_rank和ntile)的比较
排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: 1.row_number 2.rank 3.dense_rank 4.ntile 下面分别介绍一 ...
- hive的窗口函数ntile、row_number、rank
一.ntile 序列函数不支持window子句 数据准备: cookie1,--, cookie1,--, cookie1,--, cookie1,--, cookie1,--, cookie1,-- ...
- sql server 2000 对应 sql server 2005的row_number()、rank()、DENSE_RANK( )、ntile( )等用法
转自CSDN:http://blog.csdn.net/htl258/article/details/4006717 SQL server 2005新增的几个函数,分别是row_number( ).r ...
- Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张Order表并添加一些初始数据方便我们查看效果. CREATE TABLE [dbo].[Order ...
- SQL中的排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别. 在使用排名函数的时候需要注意以下三点: 1.排名函数必须有 OVER 子句. 2.排名函数必须有包含 ORDE ...
随机推荐
- windows phone 墓碑化(9)
原文:windows phone 墓碑化(9) 几个术语的理解: 名称 说明 ; App ap = (App)Application.Current; // 构造函数 ...
- boost::signals::signal的使用方法
吃力的讲完boost::signals的ppt.然后接着就是做练习题. 通过讲ppt,发现有一句话说的真好:你自己知道是一回事.你能给别人讲明确又是另外一回事.真的有些东西你自己理解,可是用语言去非常 ...
- android 如何分析java.lang.IllegalArgumentException: Cannot draw recycled bitmaps异常
这类问题的分析,通常你需要找到bitmap对象已经在那个位置recyle,然后检查代码. 如何定位的位置,其中代码具有对bitmap 目的recyle.能够 Bitmap.java的recycle方法 ...
- hdu1372 dfs搜索之国际象棋的马
原题地址 题意 一个8x8的国际象棋棋盘,你有一个棋子"马".算出棋子"马"从某一格到还有一格子的最少步数. 与普通dfs不同的是,你能走的路线不是上下左右,四 ...
- 两个堆叠fragment,上层fragment响应于降低fragment的button点击事件补救措施
加入onViewCreated的Touch事件监听, 以解决叠在一起的fragment上层响应下层的button点击事件解决方法 @Override public void onViewCreated ...
- 采用Sambaserver由win平台,linux平台上传文件
1.构造yum [root@db /]# cd /etc/yum.repos.d/ [root@db yum.repos.d]# vi yum.repo --改动光盘挂载位置,enabled设置为启动 ...
- ZOJ Problem Set - 2563 Long Dominoes 【如压力dp】
称号:ZOJ Problem Set - 2563 Long Dominoes 题意:给出1*3的小矩形.求覆盖m*n的矩阵的最多的不同的方法数? 分析:有一道题目是1 * 2的.比較火.链接:这里 ...
- CCLayer在Touch事件(Standard Touch Delegate和Targeted Touch Delegate)
在做练习,触摸故障,看到源代码,以了解下触摸事件. 练习操作:直CClayer子类init在 this->setTouchEnabled(true); 事件处理方法覆盖 virtual bool ...
- 2014百度之星资格赛——Disk Schedule
2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...
- Android - 数据存储 -存储键值对
如果你有少量的键值数据需要存储,可以使用SharedPreferencesAPI.SharedPreferences对象指向一个包含键值对的文件并且提供了一些简单的方法来读取它们.每个SharedPr ...