博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MariaDB Window Functions窗口函数分组取TOP N记录
阅读量:7117 次
发布时间:2019-06-28

本文共 1692 字,大约阅读时间需要 5 分钟。

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

查询结果

图片.png

现在取出各班前三名

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

图片.png

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

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

图片.png

通过窗口函数,非常轻松的实现分析需求,而使用传统的方法,会非常复杂,SQL理解起来也很困难。

例:

SELECT a.id,a.SName,a.ClsNo,a.Score FROM student a LEFT JOIN student b ON a.ClsNo=b.ClsNoAND a.Score
<3ORDER BY a.ClsNo,a.Score DESC;

图片.png

参考:

转载地址:http://bqyel.baihongyu.com/

你可能感兴趣的文章
10 001st prime number
查看>>
C#-MessageBox全部函数重载形式及举例
查看>>
滑板控制器
查看>>
oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)
查看>>
hibernate建表 一对多 多的一方控制一的一方
查看>>
OpenCL 获取Program信息
查看>>
用jinja做了个E-Letter小项目
查看>>
Java与.NET DES加密解密互转
查看>>
ExternalInterface的简单使用方法
查看>>
iOS开发之微信聊天工具栏的封装
查看>>
Jquery 延迟加载框架
查看>>
Dijkstra算法
查看>>
Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)
查看>>
MYSQL SQL Server 事务
查看>>
主线程不能直接调用webservice方法
查看>>
使用 ext3grep 恢复数据试验成功 笔记
查看>>
蜕变成蝶~Linux设备驱动之DMA
查看>>
Shape 与 InlineShape 的区别
查看>>
Eclipse 相同变量背景高亮显示设置(Occurrences)
查看>>
Android Gradle Plugin指南(四)——測试
查看>>