MariaDB Window Functions窗口函数分组取TOP N记录
窗口函数在MariaDB10.2版本里实现,其简化了复杂SQL的撰写,提高了可读性。
在某些方面,窗口函数类似于聚集函数, 但它不像聚集函数那样每组只返回一个值,窗口函数可以为每组返回多个值。
作为一种高级查询功能,解释起来并非易事。提供窗口函数介绍的最佳方法是通过示例,让我们看看窗口函数实现分组取TOP N记录。
表结构
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`SName` varchar(100) DEFAULT NULL COMMENT '姓名',`ClsNo` varchar(100) DEFAULT NULL COMMENT '班级',`Score` int(11) DEFAULT NULL COMMENT '分数',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
insert into `student`(`id`,`SName`,`ClsNo`,`Score`) values (1,'AAAA','C1',67),(2,'BBBB','C1',55),(3,'CCCC','C1',67),(4,'DDDD','C1',65), (5,'EEEE','C1',95),(6,'FFFF','C2',57),(7,'GGGG','C2',87),(8,'HHHH','C2',74), (9,'IIII','C2',52),(10,'JJJJ','C2',81),(11,'KKKK','C2',67),(12,'LLLL','C2',66), (13,'MMMM','C2',63),(14,'NNNN','C3',99),(15,'OOOO','C3',50),(16,'PPPP','C3',59), (17,'QQQQ','C3',66),(18,'RRRR','C3',76),(19,'SSSS','C3',50),(20,'TTTT','C3',50), (21,'UUUU','C3',64),(22,'VVVV','C3',74);
查询结果
现在取出各班前三名
SELECT SName,ClsNo,Score, dense_rank() OVER (PARTITION BY ClsNo ORDER BY Score DESC) AS top3 FROM student;
使用窗口函数需要OVER关键字。 dense_rank()是一个特殊的排名函数,只能作为“窗口函数”使用,不能在没有OVER子句的情况下使用。
OVER子句支持一个名为PARTITION BY的关键字,它与GROUP BY的工作方式非常相似。 使用PARTITION BY,我们将按照班级分组,并单独计算排名行号。
我们可以看到每个班级都有一个单独的排名顺序。
窗口函数的计算发生在WHERE,GROUP BY和HAVING子句完成之后,在ORDER BY之前。固这里需要外包一层派生表得到最终排名结果。
SELECT * FROM (SELECT SName,ClsNo,Score, dense_rank() OVER (PARTITION BY ClsNo ORDER BY Score DESC) AS top3 FROM student) AS tmp WHERE tmp.top3 <=3 ORDER BY tmp.ClsNO ASC,tmp.Score DESC;
通过窗口函数,非常轻松的实现分析需求,而使用传统的方法,会非常复杂,SQL理解起来也很困难。
例:
SELECT a.id,a.SName,a.ClsNo,a.Score FROM student a LEFT JOIN student b ON a.ClsNo=b.ClsNo AND a.Score<b.Score GROUP BY a.id,a.SName,a.ClsNo,a.Score HAVING COUNT(b.id)<3 ORDER BY a.ClsNo,a.Score DESC;
参考:
https://mariadb.com/kb/en/library/window-functions-overview/
https://blog.csdn.net/acmain_chm/article/details/4126306
转载于:https://blog.51cto.com/hcymysql/2296236
MariaDB Window Functions窗口函数分组取TOP N记录相关推荐
- 【Clickhouse】Clickhouse 分析函数 window functions 窗口函数
文章目录 1.概述 1.1.窗口函数: 1.2.标准SQL语法 1.3.分析函数分类: 2.Top N: 3.案例 1.概述 转载:Clickhouse 分析函数 window functions 窗 ...
- 巧用row_number和partition by分组取top数据
2019独角兽企业重金招聘Python工程师标准>>> 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 20 ...
- oracle分组_MySQL分组取TOP,实现Oracle的ROW_NUMBER函数的功能
Excel中分组排序只需要对数据进行升序降序,再利用if函数添加排序序号,即可筛选出分组top数据. Oracle也有row_number()函数对数据进行分组排序,而MySQL并没有此类函数,那么如 ...
- hive udf 分组取top1_Hive分组取Top K数据
1.ROW_NUMBER,RANK(),DENSE_RANK() 语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rank ...
- Hive 分组取Top N
成绩表S,字段sid,cid,score 求每门课程的前2名与后2名sid with a as (select sid,rank() over(distribute by cid sort by sc ...
- hive中分组取前N个值的实现
背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科 ...
- Hive中分组取前N个值
分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的 ...
- postgresql Window Functions
Window Functions 窗口函数不会像非窗口聚合调用那样使行分组到单个输出行中.相反,这些行保留了它们单独的身份.不可以和GROUP BY. WHERE子句一起用.如果在执行窗口计算后需要过 ...
- hive udf 分组取top1_Hive中分组取前N个值的实现-row_number()
背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科 ...
最新文章
- sql中like带参数的写法
- not accessible due to restriction on required library
- 在cygwin下编译c语言
- Django 用 uploadify 实现图片批量上传
- python生成随机验证码(字母加数字的组合)
- Direct2D (13) : 画刷之 ID2D1BitmapBrush
- jsp+php 服务器环境,Windows下Apache+Tomcat+jsp+php的服务器整合配置
- Spring AOP中的前置通知和后置通知详解
- 常用计算机函数公式,最常用的Excel函数公式大全
- excel 如何删除有颜色的行
- python安卓模拟器图像识别_Android模拟器识别检测技术
- win10设置窗口背景
- iThenticate查重系统的使用及如何去除参考文献
- python数据分析与展示--图像的手绘效果
- python支付宝自动支付_python 调用支付宝支付
- 在Chrome、Firefox等浏览器中实现低延迟播放海康、大华RTSP
- springmvc 发送PUT 和 DELETE 请求
- miniK8S单节点环境搭建初试
- 在LoadRunner中处理dotNET的VIEWSTATE(摘自关河)
- 跨ESXi主机的裸磁盘映射(RDM)搭建MSCS群集
热门文章
- 中国产教融合市场发展模式与运营前景咨询报告2022版
- 中国钢铁行业战略规划及项目建设动态分析报告2021-2027年
- 中国牡蛎碳酸钙市场需求现状调研及十四五投资风险评估报告2022-2028年版
- 6.6.1 CPropertySheet类
- 全球四大农业贸易数字化-丰收节贸易会:谋定粮食区块链
- 1028. List Sorting (25)
- 探索RequestBody报com.alibaba.fastjson.JSONObject cannot be cast to xxx
- React项目开发中的数据管理
- hdoj-1715-大菲波数(大斐波那契数列)
- elasticsearch6 学习之安装