三者的区别如下:

  • rank()排序相同时会重复,总数不变,即会出现1、1、3这样的排序结果;
  • dense_rank()排序相同时会重复,总数会减少,即会出现1、1、2这样的排序结果;
  • row_number()排序相同时不会重复,会根据顺序排序。

具体实例

建表、插入数据

create table rownumber(id varchar(10) not null,name varchar(10) null,age varchar(10) null,salary int null
);insert into rownumber(id,name,age,salary) values(1,'a',10,8000);
insert into rownumber(id,name,age,salary) values(1,'a2',11,7500);
insert into rownumber(id,name,age,salary) values(2,'b',12,7500);
insert into rownumber(id,name,age,salary) values(2,'b2',13,4500);
insert into rownumber(id,name,age,salary) values(3,'c',14,8000);
insert into rownumber(id,name,age,salary) values(3,'c2',15,20000);
insert into rownumber(id,name,age,salary) values(4,'d',16,30000);
insert into rownumber(id,name,age,salary) values(5,'d2',17,8000);
select * from rownumber;

数据

row_number()

select *, row_number() over(order by salary) as `rank` from rownumber;

row_number()排序结果

rank()

select *, rank() over(order by salary) as `rank` from rownumber;

rank()排序结果

dense_rank()

select *, dense_rank() over(order by salary) as `rank` from rownumber;

dense_rank()排序结果

row_number()的详细用法

1.分组排序

select *, row_number() over(partition by id order by salary) as `rank` from rownumber;

2. 每组内第二名的信息

select * from (
select *, row_number() over(partition by id order by salary) as `rank` from
rownumber) as temp
where `rank` = 2;

3. 给年龄在13岁到16岁的数据按salary排名

select *, row_number() over (order by salary) as `rank` from rownumber
where age between 13 and 16;

注:

row_number函数得到的列别名可用于order by 排序,因为order by执行在select之后。

where, group by, having都不可引用该列,因为这些语句执行在select之前,此时函数尚未计算出值。

--创建测试表
create table te.sc(id int, name varchar(20),class varchar(20), score int);--给测试表插入数据
insert into te.sc values (1,'张飞','一年一班',100);
insert into te.sc values (2,'刘备','一年一班',99);
insert into te.sc values (3,'李逵','一年一班',95);
insert into te.sc values (4,'小动','一年一班',97);
insert into te.sc values (5,'小智','一年一班',80);
insert into te.sc values (6,'吕布','一年二班',67);
insert into te.sc values (7,'赵云','一年二班',90);
insert into te.sc values (8,'典韦','一年二班',89);
insert into te.sc values (9,'关羽','一年二班',70);
insert into te.sc values (10,'马超','一年二班',98);
insert into te.sc values (11,'张媛','一年一班',100);
--列出每个班分数排名前三的学生select * from (select id, name, class, score , row_number() over (partition by class order by score desc) as r1,rank() over (partition by class order by score desc) as r2 ,dense_rank() over (partition by class order by score desc) as r3 from te.sc) B where r1<=3 ;id     name     class     score     r1   r2   r3
1      张飞    一年一班    100        1    1    1
11     张媛    一年一班    100        2    1    1
2      刘备    一年一班    99         3    3    2
10     马超    一年二班    98         1    1    1
7      赵云    一年二班    90         2    2    2
8      典韦    一年二班    89         3    3    3

这三个函数的区别主要在分数一致的情况下,row_number()不重复排序,rank()重复且跳数字排序,dense_rank()重复且不跳数字排序。

SQL排序之 row_number, rank(), dense_rank()区别相关推荐

  1. Hive分析窗口函数 NTILE,ROW_NUMBER,RANK,DENSE_RANK

    本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途. Hive版本为 apache-hive-0.13.1 数据准备: cookie1 ...

  2. SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile

    总结四个函数的特点: row_number():连续不重复:1234567 rank() :重复不连续:1222567 dense_rank():重复且连续:1222345 ntile():平均分组: ...

  3. Hive ROW_NUMBER,RANK(),DENSE_RANK()

    准备数据 浙江,杭州,300 浙江,宁波,150 浙江,温州,200 浙江,嘉兴,100 江苏,南京,270 江苏,苏州,299 江苏,某市,200 江苏,某某市,100 创建表 CREATE tab ...

  4. SQL新函数, 排名函数 - ROW_NUMBER(), RANK(), DENSE_RANK()

    ROW_NUMBER() 根据over后的order by字据的字段排序,返回一个不断递增的整数. use  Northwind go select  CompanyName, ContactName ...

  5. Sql Server中Row_Number()函数

    1.使用row_number()函数进行编号:如 select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Cu ...

  6. MySQL 三个排序方法 row_number()、rank()、dense_rank()

    Mysql三个常用的排序方法 前言 准备工作 实验过程 ==row_number()== ==rank()== ==dense_rank()== 结论 前言 在数据库查询中,我们经常要进行排序,排名, ...

  7. SQL 中 Rank、row_number、dense_rank 三种排序函数的区别

    现有一张工资表,需要对其进行排名,工资相同的人并列排名,然后再排名,很多刚接触的小伙伴估计第一时间想到Rank()函数或row_number() 函数,但是结果出来后并不是自己想要的,在这里就给大家介 ...

  8. rank,dense_rank,row_number使用和区别

    rank,dense_rank,row_number区别 一:语法(用法):      rank() over([partition by col1] order by col2)       den ...

  9. 常用sql001_partition by 以及 row_number()和 dense_rank()和rank()区别

    create table student (sid varchar2(10), --学号sname varchar2(10), --姓名classid varchar2(10), --班级号score ...

最新文章

  1. 携程是如何把大数据用于实时风控的
  2. JTree用法及JTree使用经验总结转
  3. SAP系统的配置传输分为两种情况:
  4. Cannot delete .... . Name node is in safe mode
  5. Unity 2D教程: 滚动,场景和音效
  6. 自动驾驶 10-3: 全球导航卫星系统 (GNSS)The Global Navigation Satellite Systems
  7. 简述hdfs工作原理_简述HDFS的原理?
  8. C语言中数组名的使用总结
  9. 几个网络捕获工具的评价
  10. android系统蓝牙音箱功能吗,Android蓝牙开发系列文章-其实你的手机可以变成一个蓝牙音箱...
  11. 【信息系统项目管理师】第三章 立项管理思维导图
  12. 企业如何利用BaaS平台快速部署区块链应用落地
  13. 鼠标手--IT人士/电脑使用者、网民的职业病,给网友们提个醒
  14. Java研发技术学习路线
  15. labelme画出的标注json转换成二值标签图,并解决label全黑问题
  16. 浏览器搜索去除广告项
  17. [R语言]{实例}车辆车架号VIN码校验函数
  18. 成就你一生的100个哲理11-20
  19. 2022年值得关注的5个区块链项目 数字藏品平台开发搭建
  20. AIX各项知识链接(IBM官网)

热门文章

  1. ftok()函数深度解析
  2. 葛洲坝集团电力有限责任公司召开第七次董事会
  3. Resharper使用技巧
  4. 微软发布Win8内幕 危机创新颠覆传统
  5. 秒速5 厘米经典台词
  6. sicily 2013
  7. 果然AIGC还是对动漫制作下手了,不过是从数据集AnimeRun开始
  8. 微信公众号加密的学习
  9. Python经典书籍有哪些?这份书单送给你
  10. 手机开机启动慢是什么原因_电脑启动慢是什么原因