MariaDB Window Functions窗口函数分组取TOP N记录
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,窗口函数在MariaDB10.2版本里实现,其简化了复杂SQL的撰写,提高了可读性。在某些方面,窗口函数类似于聚集函数, 但它不像聚集函数那样每组只返回一个值,窗口函数可以为每组返回多个值。作为一种高
千家信息网最后更新 2025年01月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安全错误
数据库的锁怎样保障安全
如何连接数据库两张表
计算机网络安全威胁的根源
mysql回复误删数据库
海南盈泰网络技术有限公司怎么样
浩然网络技术有限公司
梅州通讯软件开发价格走势
襄阳特杰飞腾软件开发
北京进口软件代理服务器
软件开发资本化包括
lm软件开发
软件开发承诺书样本
迷你服务器怎么装
迪庆软件开发
惠普服务器怎么进入磁盘管理
怎样远程管理服务器
国家网络安全协同指挥平台
上海赛铠网络安全技术有限公司
数据库 安卓软件
哪种数据库易用好
冷水江计算机网络技术
红盟网络安全工作室直播
众人互联网科技有限公司建站
textbox 数据库
服务器管理操作规程
我的世界电脑开服务器免费软件
51cto的网络安全
同服务器网站被挂马
做网络技术有什么要求
微信开发者工具如何导入数据库
db2连不上数据库