MariaDB Window Functions窗口函数分组取TOP N记录
admin
2023-04-21 22:43:32
0

窗口函数在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);

查询结果

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


现在取出各班前三名

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,我们将按照班级分组,并单独计算排名行号。

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

我们可以看到每个班级都有一个单独的排名顺序。


窗口函数的计算发生在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;

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

通过窗口函数,非常轻松的实现分析需求,而使用传统的方法,会非常复杂,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

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


参考:

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

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




相关内容

热门资讯

【第一消息】“新超凡炸/金/花... 您好:新超凡炸/金/花这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在...
今日重大消息“夏天yy到底有挂... 今日重大消息“夏天yy到底有挂吗?”(确实真的有挂)您好,夏天yy这个游戏其实有挂的,确实是有挂的,...
玩家最新攻略“好玩茶楼是不是有... 您好:好玩茶楼这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游戏...
今日重大消息“越记乡游有挂吗?... 今日重大消息“越记乡游有挂吗?”(其实是有挂)您好,越记乡游这个游戏其实有挂的,确实是有挂的,需要了...
上海跨年夜有游客提前4小时到达... 极目新闻记者 杜光然12月31日,来自全国多地的游客陆续抵达上海,在执勤人员的引导下进入外滩沿江观景...
今日重大发现“富豪麻将究竟有挂... 今日重大发现“富豪麻将究竟有挂吗?”(必胜开挂神器)您好,富豪麻将这个游戏其实有挂的,确实是有挂的,...
【第一消息】“甘孜娱乐中心怎么... 【第一消息】“甘孜娱乐中心怎么开挂?”(太坑了原来有挂)您好,甘孜娱乐中心这个游戏其实有挂的,确实是...
北京大学科学yeah!跨年演讲... 真实的“流浪地球”是什么样子?如何让机器人像人一样思考?古DNA技术如何为考古提供新思路?12月29...
机器人也能暖人心?全球首款情感... 封面新闻记者 边雪 不同于机器人或银或黑的皮肤,“爱湫-AIQ”一身淡绿,还有一双灵动的眼睛。 20...
今日重磅消息“芒果竞技辅助器?... 有 亲,根据资深记者爆料芒果竞技是可以开挂的,确实有挂(咨询软件无需打开...