千家信息网

MariaDB Window Functions窗口函数分组取TOP N记录

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,窗口函数在MariaDB10.2版本里实现,其简化了复杂SQL的撰写,提高了可读性。在某些方面,窗口函数类似于聚集函数, 但它不像聚集函数那样每组只返回一个值,窗口函数可以为每组返回多个值。作为一种高
千家信息网最后更新 2024年11月23日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 top3FROM 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 tmpWHERE 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.ClsNoAND a.Score


参考:

https://mariadb.com/kb/en/library/window-functions-overview/

https://blog.csdn.net/acmain_chm/article/details/4126306




函数 子句 班级 分组 复杂 关键 关键字 方法 结果 查询 特殊 相似 高级 困难 并非易事 传统 分数 功能 可读性 多个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 龙华靠谱的服务器运维服务 软件开发公司线上如何接单 网络安全中什么是群 不同服务器如何寄东西 数据库开启事务有多快 ftp服务器功能 余姚游戏软件开发项目 联想服务器 配置 短信服务器才能发出去是什么意思 僵尸毁灭工程怎么看服务器多少天 学编程和软件开发去哪里学 石林品牌软件开发价格信息 百度数码兽数据库 黎明觉醒服务器正在维修中怎么办 娄底口碑好的软件开发报价 网信西藏网络安全法答案 不加域怎么进服务器 东莞市互联网科技公司 江苏节能刀片服务器价格 怎么恢复sql数据库 软件开发如何进行审计 我的世界正版服务器邀请好友 互联网软件开发编程专业 ups 服务器 基层部队网络安全防范措施 山东信息职业技术学院网络技术 怎么找到我的世界的服务器 北京电商软件开发哪家便宜 网络技术营销英文用语 中二网络技术安全考试
0