SQL排序之 row_number, rank(), dense_rank()区别
三者的区别如下:
- 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()区别相关推荐
- Hive分析窗口函数 NTILE,ROW_NUMBER,RANK,DENSE_RANK
本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途. Hive版本为 apache-hive-0.13.1 数据准备: cookie1 ...
- SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile
总结四个函数的特点: row_number():连续不重复:1234567 rank() :重复不连续:1222567 dense_rank():重复且连续:1222345 ntile():平均分组: ...
- Hive ROW_NUMBER,RANK(),DENSE_RANK()
准备数据 浙江,杭州,300 浙江,宁波,150 浙江,温州,200 浙江,嘉兴,100 江苏,南京,270 江苏,苏州,299 江苏,某市,200 江苏,某某市,100 创建表 CREATE tab ...
- SQL新函数, 排名函数 - ROW_NUMBER(), RANK(), DENSE_RANK()
ROW_NUMBER() 根据over后的order by字据的字段排序,返回一个不断递增的整数. use Northwind go select CompanyName, ContactName ...
- Sql Server中Row_Number()函数
1.使用row_number()函数进行编号:如 select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Cu ...
- MySQL 三个排序方法 row_number()、rank()、dense_rank()
Mysql三个常用的排序方法 前言 准备工作 实验过程 ==row_number()== ==rank()== ==dense_rank()== 结论 前言 在数据库查询中,我们经常要进行排序,排名, ...
- SQL 中 Rank、row_number、dense_rank 三种排序函数的区别
现有一张工资表,需要对其进行排名,工资相同的人并列排名,然后再排名,很多刚接触的小伙伴估计第一时间想到Rank()函数或row_number() 函数,但是结果出来后并不是自己想要的,在这里就给大家介 ...
- rank,dense_rank,row_number使用和区别
rank,dense_rank,row_number区别 一:语法(用法): rank() over([partition by col1] order by col2) den ...
- 常用sql001_partition by 以及 row_number()和 dense_rank()和rank()区别
create table student (sid varchar2(10), --学号sname varchar2(10), --姓名classid varchar2(10), --班级号score ...
最新文章
- 携程是如何把大数据用于实时风控的
- JTree用法及JTree使用经验总结转
- SAP系统的配置传输分为两种情况:
- Cannot delete .... . Name node is in safe mode
- Unity 2D教程: 滚动,场景和音效
- 自动驾驶 10-3: 全球导航卫星系统 (GNSS)The Global Navigation Satellite Systems
- 简述hdfs工作原理_简述HDFS的原理?
- C语言中数组名的使用总结
- 几个网络捕获工具的评价
- android系统蓝牙音箱功能吗,Android蓝牙开发系列文章-其实你的手机可以变成一个蓝牙音箱...
- 【信息系统项目管理师】第三章 立项管理思维导图
- 企业如何利用BaaS平台快速部署区块链应用落地
- 鼠标手--IT人士/电脑使用者、网民的职业病,给网友们提个醒
- Java研发技术学习路线
- labelme画出的标注json转换成二值标签图,并解决label全黑问题
- 浏览器搜索去除广告项
- [R语言]{实例}车辆车架号VIN码校验函数
- 成就你一生的100个哲理11-20
- 2022年值得关注的5个区块链项目 数字藏品平台开发搭建
- AIX各项知识链接(IBM官网)