窗口函数在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 top3
FROM 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 tmp
WHERE 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.ClsNo
AND a.Score<b.Score
GROUP BY a.id,a.SName,a.ClsNo,a.Score HAVING COUNT(b.id)<3
ORDER BY a.ClsNo,a.Score DESC;

参考:

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

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

转载于:https://blog.51cto.com/hcymysql/2296236

MariaDB Window Functions窗口函数分组取TOP N记录相关推荐

  1. 【Clickhouse】Clickhouse 分析函数 window functions 窗口函数

    文章目录 1.概述 1.1.窗口函数: 1.2.标准SQL语法 1.3.分析函数分类: 2.Top N: 3.案例 1.概述 转载:Clickhouse 分析函数 window functions 窗 ...

  2. 巧用row_number和partition by分组取top数据

    2019独角兽企业重金招聘Python工程师标准>>> 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 20 ...

  3. oracle分组_MySQL分组取TOP,实现Oracle的ROW_NUMBER函数的功能

    Excel中分组排序只需要对数据进行升序降序,再利用if函数添加排序序号,即可筛选出分组top数据. Oracle也有row_number()函数对数据进行分组排序,而MySQL并没有此类函数,那么如 ...

  4. hive udf 分组取top1_Hive分组取Top K数据

    1.ROW_NUMBER,RANK(),DENSE_RANK() 语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rank ...

  5. Hive 分组取Top N

    成绩表S,字段sid,cid,score 求每门课程的前2名与后2名sid with a as (select sid,rank() over(distribute by cid sort by sc ...

  6. hive中分组取前N个值的实现

    背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科 ...

  7. Hive中分组取前N个值

    分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的 ...

  8. postgresql Window Functions

    Window Functions 窗口函数不会像非窗口聚合调用那样使行分组到单个输出行中.相反,这些行保留了它们单独的身份.不可以和GROUP BY. WHERE子句一起用.如果在执行窗口计算后需要过 ...

  9. hive udf 分组取top1_Hive中分组取前N个值的实现-row_number()

    背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科 ...

最新文章

  1. sql中like带参数的写法
  2. not accessible due to restriction on required library
  3. 在cygwin下编译c语言
  4. Django 用 uploadify 实现图片批量上传
  5. python生成随机验证码(字母加数字的组合)
  6. Direct2D (13) : 画刷之 ID2D1BitmapBrush
  7. jsp+php 服务器环境,Windows下Apache+Tomcat+jsp+php的服务器整合配置
  8. Spring AOP中的前置通知和后置通知详解
  9. 常用计算机函数公式,最常用的Excel函数公式大全
  10. excel 如何删除有颜色的行
  11. python安卓模拟器图像识别_Android模拟器识别检测技术
  12. win10设置窗口背景
  13. iThenticate查重系统的使用及如何去除参考文献
  14. python数据分析与展示--图像的手绘效果
  15. python支付宝自动支付_python 调用支付宝支付
  16. 在Chrome、Firefox等浏览器中实现低延迟播放海康、大华RTSP
  17. springmvc 发送PUT 和 DELETE 请求
  18. miniK8S单节点环境搭建初试
  19. 在LoadRunner中处理dotNET的VIEWSTATE(摘自关河)
  20. 跨ESXi主机的裸磁盘映射(RDM)搭建MSCS群集

热门文章

  1. 中国产教融合市场发展模式与运营前景咨询报告2022版
  2. 中国钢铁行业战略规划及项目建设动态分析报告2021-2027年
  3. 中国牡蛎碳酸钙市场需求现状调研及十四五投资风险评估报告2022-2028年版
  4. 6.6.1 CPropertySheet类
  5. 全球四大农业贸易数字化-丰收节贸易会:谋定粮食区块链
  6. 1028. List Sorting (25)
  7. 探索RequestBody报com.alibaba.fastjson.JSONObject cannot be cast to xxx
  8. React项目开发中的数据管理
  9. hdoj-1715-大菲波数(大斐波那契数列)
  10. elasticsearch6 学习之安装