背景

区分/分区/分组排序;
区分多组有序数据中的部分特典数据;

适用场景

前提:有序数据

  • 查询 每组 前N、第N、后N个记录;
  • 排序编号;
  • 分页;

案例(一瓢饮):每个班级第n名 ,有下表(伪数据)

s_class s_name score_chinese score_maths score_english
1 1a 90 90 90
1 1b 90 90 90
1 1c 85 85 85
1 1d 85 85 85
1 1e 80 80 80
2 2a 95 95 90
2 2b 90 88 88
2 2c 77 90 55
问题

查询每班第2名同学的总分,名称

假设:相同成绩并列排名

SQL 伪代码

SELECT*
FROM(SELECTtmp.*,DENSE_RANK() over ( PARTITION BY s_class ORDER BY total_score DESC ) s_rank FROM( SELECT ( score_english + score_chinese + score_maths ) AS total_score, s_class, s_name FROM stu_score ) tmp ) s
WHEREs_rank = 2;

窗口函数 介绍

DENSE_RANK() over_clause

分区排序,相同则并列/并序/同序,且顺序(值)连续,一般需要配合 ORDER BY,不然 顺序权重相同

Returns the rank of the current row within its partition, without gaps. Peers are considered ties and receive the same rank. This function assigns consecutive ranks to peer groups; the result is that groups of size greater than one do not produce noncontiguous rank numbers.
返回当前行在其分区中的排名,没有间隙。同行被视为平局并获得相同的排名。此功能为对等组分配连续等级;结果是大小大于 1 的组不会产生不连续的秩数。

RANK() over_clause

分区排序,相同则同序,且顺序(值)不连续,一般需要配合 ORDER BY,不然 顺序权重相同

Returns the rank of the current row within its partition, with gaps. Peers are considered ties and receive the same rank. This function does not assign consecutive ranks to peer groups if groups of size greater than one exist; the result is noncontiguous rank numbers.
返回当前行在其分区中的排名,有间隔。同行被视为平局并获得相同的排名。如果存在大小大于 1 的组,则此函数不会为对等组分配连续的等级;结果是不连续的排名数字。

The following query shows the difference between RANK(), which produces ranks with gaps, and DENSE_RANK(), which produces ranks without gaps. The query shows rank values for each member of a set of values in the val column, which contains some duplicates. RANK() assigns peers (the duplicates) the same rank value, and the next greater value has a rank higher by the number of peers minus one. DENSE_RANK() also assigns peers the same rank value, but the next higher value has a rank one greater. For reference, the query also displays row numbers using ROW_NUMBER():
以下查询显示了 之间的区别 RANK(),它产生有间隙的等级,和DENSE_RANK(),它产生没有间隙的等级。该查询显示列中一组值的每个成员的排名值 val,其中包含一些重复项。RANK()为对等点(重复项)分配相同的排名值,并且下一个更大的值具有更高的排名,对等点的数量减去一。DENSE_RANK()还为对等点分配相同的排名值,但下一个较高值的排名大一。作为参考,查询还使用以下方式显示行号 ROW_NUMBER()

ROW_NUMBER() over_clause

分区排序,相同不同序,且顺序(值)连续

返回其分区中当前行的编号。行数范围从 1 到分区行数。
ORDER BY 影响行编号的顺序。没有ORDER BY,行编号是不确定的。
ROW_NUMBER()为对等点分配不同的行号。要为对等点分配相同的值,请使用 RANK()DENSE_RANK()。例如,请参阅RANK()功能说明。

排序编号 伪案例参考
DENSE_RANK() RANK() ROW_NUMBER()
A 10 1 1 1
B 10 1 1 2
C 9 2 3 3
D 8 3 4 4
E 8 3 4 5
F 8 3 4 6
G 7 4 7 7
参考

mysql 官方文档:https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_dense-rank

窗口函数概念和语法:https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html

常用/适用场:https://www.cnblogs.com/chengjun/p/4451421.html
https://www.jb51.net/article/196634.htm

更新

注:不足之处,恕见谅,求指教。如有侵权,联系删除。

2022.08.15 初版
2022.10.10 修改语义

SQL 查询 每个班级第n名 每组第n个 区分 分区 分组排序 DENSE_RANK() RANK() ROW_NUMBER()相关推荐

  1. sql查询数据库中所有表名

    sql查询数据库中所有表名 查询数据库里所有表名和字段名的语句 SQLSERVER 查询所有表名: SELECT NAME FROM SYSOBJECTS WHERE TYPE='U' SELECT ...

  2. sql 查询 同一班级 的 姓名 相同 的所有学生的信息

    sql 查询 同一班级 的 姓名 相同 的所有学生的信息 select A.* from bus_student A inner join ( select classid,name from bus ...

  3. hive SQL 创建数据库,创建hive表、查询时,其表名,字段,统统不区分大写(在底层一律转换为小写)

    hive SQL 创建数据库,创建hive表.查询时,其表名,字段,统统不区分大写(在底层一律转换为小写) (1).默认default数据库 hive默认自带一个名为default的数据库,如果建表时 ...

  4. 也做SQL查询:班级总成绩 前三名,总成绩有相等的情况

    刚刚看到一篇博客,原帖链接:http://www.cnblogs.com/HCCZX/archive/2012/11/07/2758036.html 通常想到子查询或者临时表外加聚合函数都是没错的,但 ...

  5. sql查询一个班级中男女各有多少人及总人数

    表结构及数据: 其中 1 代表是男生 ,2 代表是女生 ,然后我们要得到下面这种结果: 可以结合 sum 函数.case 函数以及 count 函数来实现 SELECTclass AS 班级,SUM( ...

  6. Java 中如何使用 SQL 查询文本

    [摘要]         使用 SQL 查询语言,你只能查询位于数据库里面的数据,但是当你面对的数据是一些 Excel 表格或者 Txt 文本格式时,有什么办法能直接对着文件进行 Select 查询呢 ...

  7. java 查询sql_Java 中如何使用 SQL 查询文本

    [摘要] 使用 SQL 查询语言,你只能查询位于数据库里面的数据,但是当你面对的数据是一些 Excel 表格或者 Txt 文本格式时,有什么办法能直接对着文件进行 Select 查询呢?去乾学院看个究 ...

  8. sql 查询 同一手机号的 姓名 相同 的所有学生的信息

    sql 查询 同一手机号的 姓名 相同 的所有学生的信息 select A.* from bus_student A inner join ( select photo,name from bus_s ...

  9. bigquery_到Google bigquery的sql查询模板,它将您的报告提升到另一个层次

    bigquery In this post, we're sharing report templates that you can build with SQL queries to Google ...

最新文章

  1. 使用CNN做文本分类——将图像2维卷积换成1维
  2. java责任链模式的三种方式,分享一点面试小经验
  3. webstorm git 怎么断开版本控制 webstorm git for windows 禁止 自动运行
  4. Spring 的优秀工具类盘点
  5. kafka基本操作:创建topic、生产/消费消息(同一消费组均分消息;不同消费组订阅消息)
  6. 每天一算法(一)——用链表实现加减乘运算
  7. 阿里云服务器如何扩容云盘?
  8. eclipse安装反编译插件:jd-eclipse 查看源码
  9. python 绘图sns.distplot
  10. Android JSON 数据解析 之原生 API
  11. java教师考勤系统,javaweb课堂考勤管理系统
  12. 鸿蒙支持ps4手柄吗,PS5硬件兼容性测试:哪些PS4硬件可以在PS5上使用
  13. 瑞雪时晴,不亦快哉   ——图灵十一月月刊
  14. 鸟哥的Linux私房菜之Linux 的文件权限与目录管理(一)
  15. 激光雷达与自动驾驶详解
  16. vue+element 获取中文首字母,转换成大写
  17. 风险预测模型评价第二弹:NRI的R语言计算
  18. 操作系统(一)——操作系统概述
  19. 有趣好玩实用的网站 保证闻所未闻
  20. HTML中z index属性是用来,css中z-index 属性与用法详解

热门文章

  1. 学历不够技术来凑!面试BATJ最终入职京东,整理出2020船新版本最新面试真题全部开源分享!
  2. Python的优势、缺点、应用领域介绍
  3. javascript如何判断浏览器的类型?
  4. 所得之--大家都遇到过哪些自己很佩服的人?
  5. OTA争做“盲盒”生意,吹响“五一流量争夺战”号角?
  6. python线程池传入多个参数_python 线程池ThreadPoolExecutor
  7. 白鹭张晨樱:认知的边界,另类的独特
  8. Problem D: 梯田AGAIN
  9. [AHK]获取同花顺软件中的持仓信息
  10. php 过滤变量,thinkphp6 输入变量过滤