博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
阅读量:5795 次
发布时间:2019-06-18

本文共 1203 字,大约阅读时间需要 4 分钟。

首先,我们创建一些测试数据。

if OBJECT_ID('Tempdb.dbo.#Tmp') is not null drop table #Tmp create table #Tmp ( name nvarchar(10) ) insert into #Tmp select N'张三' union select N'李四' union select N'王五' union select N'赵六' union select N'朱七' union select N'王八' union all select N'张三'

 最后一个union用union all,因为我们多一行"张三"。

 

一、ROW_NUMBER() over(partition by columnname order by columnname)

 

select ROW_NUMBER()over(order by name) as num,* from #Tmp

可以得到按name排序的结果集。

ROW_NUMBER() over()还有一种用法,可以针对某列进行分组排序。

下面结果可以看到张三有1和2两个排序,而其他的名字排序都只有1。

select ROW_NUMBER()over(partition by name order by name) as num,* from #Tmp

 

二、RANK()over(order by columnname)

大家可以从下面的结果集看到,结果集少了5的编号,而有两个4的编号,然后直接跳到编号6。

select RANK()over(order by name),* from #Tmp

 

三、DENSE_RANK()over(order by columnname)

select DENSE_RANK()over(order by name),* from #Tmp

执行Sql后发现,下面的结果集有2个编号4的行,紧接着就是编号5的行。

DENSE_RANK()函数和RANK()函数差不多。

RANK()函数不管分几组,最后的编号一定和行数相同。

DENSE_RANK()函数最后的编号和分组的数目有关。

 

 四、NTILE()OVER(ORDER BY COLUMNNAME)

select NTILE(2)over(order by name),* from #Tmp select NTILE(3)over(order by name),* from #Tmp

 

NTILE后面的数字,是要把查询得到的结果平均分为几组。 如下图分为2和3组。 如果行数平均划分后还有余行,那么就把行分在最前面的几组上。 比如我们的结果有7行,要分为3组。 那么第一组3行,第二组2行,第三组2行。 如果我们结果有14行,平均分为3组。 那么第一组5行,第二组5行,第三组4行。 依此类推。

 

转载地址:http://rrffx.baihongyu.com/

你可能感兴趣的文章
前端基础面试回顾--HTML+CSS
查看>>
【QQ音乐Api】移花接木 打造自己的音乐电台
查看>>
我的友情链接
查看>>
HTML5游戏开发实践指南
查看>>
20161220L05-02和L05-04老男孩Linux运维实战培训-硬盘的基础知识介绍01和02
查看>>
100baseT,1000baseX,1000baseTX,1000baseFX分别表示的意思
查看>>
25 个免费和收费的 WordPress 电商网店的模板
查看>>
SSH-KeyGen 实现linux服务器之间免密码登录
查看>>
dajngo 常用特殊查询
查看>>
maven编译的时候排除junit测试类
查看>>
dnyArray分析,动态数组分析
查看>>
CentOS分区cfdisk
查看>>
Hive安装配置
查看>>
SEO组月测试-SEO基础问题,不看答案你能答多少
查看>>
我的友情链接
查看>>
nginx修改upstream不重启的方法(ngx_http_dyups_module模块)
查看>>
/etc/inittab文件详解
查看>>
在BAE 上用tornado 做了一个Octopress 主题的博客
查看>>
乌班图系统mysql主从备份
查看>>
一个不错的命令行参数解析类
查看>>