sql实现对多个条件分组排序方法和区别
转自: http://blog.csdn.net/winer2008/article/details/4283539
rank,dense_rank,row_number区别
一:语法(用法):
rank() over([partition by col1] order by col2)
dense_rank() over([partition by col1] order by col2)
row_number() over([partition by col1] order by col2)
其中[partition by col1]可省略。
二:区别
三个分析函数都是按照col1分组内从1开始排序
row_number() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页
dense_rank() 是连续排序,两个第二名仍然跟着第三名
rank() 是跳跃拍学,两个第二名下来就是第四名
理论就不多讲了,看了案例,一下就明白了
SQL> create table t(
2 name varchar2(10),
3 score number(3));
Table created
SQL> insert into t(name,score)
2 select '语文',60 from dual union all
3 select '语文',90 from dual union all
4 select '语文',80 from dual union all
5 select '语文',80 from dual union all
6 select '数学',67 from dual union all
7 select '数学',77 from dual union all
8 select '数学',78 from dual union all
9 select '数学',88 from dual union all
10 select '数学',99 from dual union all
11 select '语文',70 from dual
12 /
10 rows inserted
SQL> select * from t;
NAME SCORE
---------- -----
语文 60
语文 90
语文 80
语文 80
数学 67
数学 77
数学 78
数学 88
数学 99
语文 70
10 rows selected
SQL> select name,score,rank() over(partition by name order by score) tt from t;
NAME SCORE TT
---------- ----- ----------
数学 67 1
数学 77 2
数学 78 3
数学 88 4
数学 99 5
语文 60 1
语文 70 2
语文 80 3 <----
语文 80 3 <----
语文 90 5
10 rows selected
SQL> select name,score,dense_rank() over(partition by name order by score) tt from t;
NAME SCORE TT
---------- ----- ----------
数学 67 1
数学 77 2
数学 78 3
数学 88 4
数学 99 5
语文 60 1
语文 70 2
语文 80 3 <----
语文 80 3 <----
语文 90 4
10 rows selected
SQL> select name,score,row_number() over(partition by name order by score) tt from t;
NAME SCORE TT
---------- ----- ----------
数学 67 1
数学 77 2
数学 78 3
数学 88 4
数学 99 5
语文 60 1
语文 70 2
语文 80 3 <----
语文 80 4 <----
语文 90 5
10 rows selected
SQL> select name,score,rank() over(order by score) tt from t;
NAME SCORE TT
---------- ----- ----------
语文 60 1
数学 67 2
语文 70 3
数学 77 4
数学 78 5
语文 80 6
语文 80 6
数学 88 8
语文 90 9
数学 99 10
10 rows selected
大家应该明白了吧!呵呵!接下来看应用
一:dense_rank------------------查询每门功课前三名
select name,score from (select name,score,dense_rank() over(partition by name order by score desc) tt from t) x where x.tt<=3
NAME SCORE
---------- -----
数学 99
数学 88
数学 78
语文 90
语文 80
语文 80
6 rows selected
二:rank------------------语文成绩70分的同学是排名第几。
select name,score,x.tt from (select name,score,rank() over(partition by name order by score desc) tt from t) x where x.name='语文' and x.score=70
NAME SCORE TT
---------- ----- ----------
语文 70 4
三:row_number——————分页查询
select xx.* from (select t.*,row_number() over(order by score desc) rowno from t) xx where xx.rowno between 1 and 3;
NAME SCORE ROWNO
---------- ----- ----------
数学 99 1
语文 90 2
数学 88 3
转载于:https://www.cnblogs.com/feigao/p/4863184.html
sql实现对多个条件分组排序方法和区别相关推荐
- mysql三个分组排序方法row_number()、rank()、dense_rank()
前言 在数据库查询中,我们经常要进行排序,排名,最常用的三个方法莫过于row_number().rank().dense_rank()了,而这三个方法又有些相近的地方,会让许多初学者感到混乱, ...
- MyBatisPlus条件构造器排序方法orderByDesc参数怎样构造
场景 项目搭建专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/37194 基础搭建: https://blog.csdn.net/B ...
- MySQL 如何实现 Oracle 的 row_number() over() 分组排序功能
文章目录 Oracle 的分组排序 MySQL 的分组排序 分析需求 创建模拟数据 SQL 实现 结果演示 Oracle 的分组排序 Oracle 的分组排序函数的语法格式如下: ROW_NUMBER ...
- [FineReport]高级条件分组、斜线、自动查询、控件编辑属性、条件属性
通常我们在做按某一条件分组汇总数据的时候,都是透过SQL去处理.如果您不熟悉SQL怎么办?FR高级条件分组可以帮您实现. 一.新建数据集 select A0188 AS ID, CAST(FLOOR( ...
- List数据转Map数据并进行分组排序
利用JAVA 8的特性实现List数据转Map数据并进行分组排序. 1.准备数据 List<Map<String, Object>> list = new ArrayList& ...
- 2019-7-27 [MySQL] DQL 简单查询[别名/去重/运算] 条件查询 排序查询 聚合查询 分组查询 导出与导入 多表操作[一对多/多对多][创外键 创联合主键 约束 添加 删除 测试]
文章目录 5 SQL语句(DQL) 5.1DQL准备工作和语法 5.1.1准备工作 5.1.2 DQL语法: 5.2 简单查询 5.2.1 查询所有的商品 5.2.2 查询商品名和商品价格. 5.2. ...
- mysql 分组排序取前n_mysql分组排序取前N条记录的最简洁的单条sql ! | 学步园
-- mysql分组排序取前N条记录的最简洁的单条sql. use test; drop table if exists test; create table test ( id int primar ...
- list对oracle结果集排序了_详解SQL窗口函数和分组排序函数
Mysql从8.0版本开始,也和Sql Server.Oracle一样支持在查询中使用窗口函数,本文将根据官方文档,通过实例介绍窗口函数并举例分组排序函数的使用. 英语好的大佬请移步官方文档~点我! ...
- SQL 分组排序后取值
SQL 分组排序后取值 场景前要: 从前有三个班级,每个班级的学生成绩各异,有一天睿智的校长希望知道这一年中,每个班级近一年里所有的学生成绩信息,和查询每个班级近一年里所有第一名的学生成绩信息,故事由 ...
最新文章
- cocos2d-x 2.X for Android中需要使用OpenGL ES 2.0
- 谷歌发布人体图像分割工具BodyPix 2.0,支持多人识别,可在iPhone上流畅运行
- StrongOD快捷键说明及其例子
- LeetCode上求两个排序数组中位数问题—— Median of Two Sorted Arrays
- 使用CSS实现图片未加载完成时占位显示
- SpringMVC学习记录--Validator验证分析
- Leetcode--123. 买卖股票的最佳时间Ⅲ
- spring 事务隔离级别和传播行为_Java工程师面试1000题146-Spring数据库事务传播属性和隔离级别...
- 多关卡连连看php源码_奇怪的连连看ios版是一款非常好玩的手机消除闯关游戏,奇怪的连连看采用了最经典的三消玩法,游戏中有着非常多的游戏关卡,是一...
- 22.案例实战:把springboot的接口,自动生成接口文档
- linux 无法启动vnc_ECS 云服务器 VNC篇
- Head First Java习题练习(二)
- 正交相机和透视相机的区别
- 【highcharts】highcharts(highmaps)实现疫情地图(一看就会篇)
- 方图来袭,且看483万亿美元的场外衍生品市场如何风云变幻
- 共享洗车机无人值守是怎样运营的?
- Face Super-Resolution Guided by 3D Facial Priors(ECCV2020)论文解读
- 高效办公——Excel表格-03篇(Excel常用快捷键 以及 Excel快捷键结合公式的各种常见的办公例子)
- 什么是闭包,闭包的作用与好处是什么,何时使用闭包,对闭包的改进
- Android手势检测简介
热门文章
- 你真的会玩SQL吗?你所不知道的 数据聚合
- 【小梅哥SOPC学习笔记】系统时钟的使用
- JavaScript反向shell
- 职场中,要善于交换利益
- 关于#include头文件问题
- 发布npm包到GitHub Packages
- python 排列组合算法_排 列 组 合 公 式 及 排 列 组 合 算 法
- 黑盒测试 白盒测试 题 1
- mysql sillyr x.so_mysql2.so:libmysqlclient_r.so.15:无法打开共享对象文件:没有这样的文件或目录...
- Linux手动释放缓存的方法