博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MariaDB Window Functions窗口函数分组取TOP N记录
阅读量:7022 次
发布时间: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://kfbxl.baihongyu.com/

你可能感兴趣的文章
在netBeans中安装javascript和css编辑器
查看>>
剑破冰山—Oracle开发艺术 内容简介
查看>>
为VS.NET 2005增加Atlas Scripts的代码提示功能
查看>>
批量插入数据的存储过程
查看>>
跨站脚本攻击(XSS)
查看>>
网站前端和后台性能优化4
查看>>
Mysql数据库主从心得整理
查看>>
Oracle SQL 性能优化技巧
查看>>
Extjs文件上传
查看>>
云场景实践研究第1期:罗辑思维
查看>>
WCF服务编程设计规范(8):服务托管、自托管代码、客户端代理管理
查看>>
第六章 Shell正则表达式
查看>>
SCCM 2012 SP1系列(六)分发部署msi软件
查看>>
C#字符串操作大全
查看>>
递归神经网络——就是解决AST这样的问题
查看>>
转] C# 泛型类型参数的约束
查看>>
Windows Phone更新NoDo Update最简单的方法
查看>>
java中byte, iso-8859-1, UTF-8,乱码的根源
查看>>
使用Kindle4rss推送自己感兴趣的博文
查看>>
【ASP.NET 基础】图片上传和显示
查看>>