转自: 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实现对多个条件分组排序方法和区别相关推荐

  1. mysql三个分组排序方法row_number()、rank()、dense_rank()

    前言     在数据库查询中,我们经常要进行排序,排名,最常用的三个方法莫过于row_number().rank().dense_rank()了,而这三个方法又有些相近的地方,会让许多初学者感到混乱, ...

  2. MyBatisPlus条件构造器排序方法orderByDesc参数怎样构造

    场景 项目搭建专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/37194 基础搭建: https://blog.csdn.net/B ...

  3. MySQL 如何实现 Oracle 的 row_number() over() 分组排序功能

    文章目录 Oracle 的分组排序 MySQL 的分组排序 分析需求 创建模拟数据 SQL 实现 结果演示 Oracle 的分组排序 Oracle 的分组排序函数的语法格式如下: ROW_NUMBER ...

  4. [FineReport]高级条件分组、斜线、自动查询、控件编辑属性、条件属性

    通常我们在做按某一条件分组汇总数据的时候,都是透过SQL去处理.如果您不熟悉SQL怎么办?FR高级条件分组可以帮您实现. 一.新建数据集 select A0188 AS ID, CAST(FLOOR( ...

  5. List数据转Map数据并进行分组排序

    利用JAVA 8的特性实现List数据转Map数据并进行分组排序. 1.准备数据 List<Map<String, Object>> list = new ArrayList& ...

  6. 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. ...

  7. mysql 分组排序取前n_mysql分组排序取前N条记录的最简洁的单条sql ! | 学步园

    -- mysql分组排序取前N条记录的最简洁的单条sql. use test; drop table if exists test; create table test ( id int primar ...

  8. list对oracle结果集排序了_详解SQL窗口函数和分组排序函数

    Mysql从8.0版本开始,也和Sql Server.Oracle一样支持在查询中使用窗口函数,本文将根据官方文档,通过实例介绍窗口函数并举例分组排序函数的使用. 英语好的大佬请移步官方文档~点我! ...

  9. SQL 分组排序后取值

    SQL 分组排序后取值 场景前要: 从前有三个班级,每个班级的学生成绩各异,有一天睿智的校长希望知道这一年中,每个班级近一年里所有的学生成绩信息,和查询每个班级近一年里所有第一名的学生成绩信息,故事由 ...

最新文章

  1. cocos2d-x 2.X for Android中需要使用OpenGL ES 2.0
  2. 谷歌发布人体图像分割工具BodyPix 2.0,支持多人识别,可在iPhone上流畅运行
  3. StrongOD快捷键说明及其例子
  4. LeetCode上求两个排序数组中位数问题—— Median of Two Sorted Arrays
  5. 使用CSS实现图片未加载完成时占位显示
  6. SpringMVC学习记录--Validator验证分析
  7. Leetcode--123. 买卖股票的最佳时间Ⅲ
  8. spring 事务隔离级别和传播行为_Java工程师面试1000题146-Spring数据库事务传播属性和隔离级别...
  9. 多关卡连连看php源码_奇怪的连连看ios版是一款非常好玩的手机消除闯关游戏,奇怪的连连看采用了最经典的三消玩法,游戏中有着非常多的游戏关卡,是一...
  10. 22.案例实战:把springboot的接口,自动生成接口文档
  11. linux 无法启动vnc_ECS 云服务器 VNC篇
  12. Head First Java习题练习(二)
  13. 正交相机和透视相机的区别
  14. 【highcharts】highcharts(highmaps)实现疫情地图(一看就会篇)
  15. 方图来袭,且看483万亿美元的场外衍生品市场如何风云变幻
  16. 共享洗车机无人值守是怎样运营的?
  17. Face Super-Resolution Guided by 3D Facial Priors(ECCV2020)论文解读
  18. 高效办公——Excel表格-03篇(Excel常用快捷键 以及 Excel快捷键结合公式的各种常见的办公例子)
  19. 什么是闭包,闭包的作用与好处是什么,何时使用闭包,对闭包的改进
  20. Android手势检测简介

热门文章

  1. 你真的会玩SQL吗?你所不知道的 数据聚合
  2. 【小梅哥SOPC学习笔记】系统时钟的使用
  3. JavaScript反向shell
  4. 职场中,要善于交换利益
  5. 关于#include头文件问题
  6. 发布npm包到GitHub Packages
  7. python 排列组合算法_排 列 组 合 公 式 及 排 列 组 合 算 法
  8. 黑盒测试 白盒测试 题 1
  9. mysql sillyr x.so_mysql2.so:libmysqlclient_r.so.15:无法打开共享对象文件:没有这样的文件或目录...
  10. Linux手动释放缓存的方法