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 服务器
基层部队网络安全防范措施
山东信息职业技术学院网络技术
怎么找到我的世界的服务器
北京电商软件开发哪家便宜
网络技术营销英文用语
中二网络技术安全考试