目录
一、什么是窗口函数
窗口函数的定义
窗口函数的语法格式
二、窗口函数的分类
专用窗口函数
聚合函数作为窗口函数
偏移分析函数
三、窗口函数的功能
在不减少原表的行数的基础上同时具有分组和排序的功能
GROUP BY 和 PARTITION BY 的区别
四、窗口函数的应用
排名问题
TOP N问题
前百分之N问题
累计问题
每组内比较问题
连续出现N次问题
五、注意事项

窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。
窗口的概念可以理解为记录集合,窗口函数也就是在满足某种条件的记录集合上执行的特殊函数。对于每条记录都要在此窗口内执行函数,窗口大小都是固定的,这种属于静态窗口;不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口。
其中,over是关键字,用来指定函数执行的窗口范围,包含三个分析子句:分组(partition by)子 句,排序(order by)子句,窗口(rows)子句
RANK()
DENSE_RANK()
ROW_NUMBER()
三者的区别:
rank()
排名结果考虑并列排名但不连续
dense_rank()
排名结果考虑并列排名且连续
row_number()
排名结果不考虑并列排名
4最值
MAX(exp) 、MIN(exp)
计算
COUNT(exp) 、SUM(exp)、AVG(exp)
LAG(exp)
LEAD(exp)
GROUP BY
GROUP BY用于将数据按照某个或多个列的值进行分组,然后对每个分组进行聚合操作。GROUP BY通常与聚合函数(如SUM、COUNT、AVG等)一起使用,以计算每个分组的统计结果。GROUP BY生成的结果集中,每个分组都有唯一的键值,并且可以使用HAVING子句对结果进行进一步过滤。
PARTITION BY
PARTITION BY用于将表或索引的数据划分为多个分区,每个分区可以单独进行管理和操作。PARTITION BY通常用于优化大型表的查询性能,通过将数据分散存储在不同的分区中,可以减少查询的范围。PARTITION BY可以按照列的值范围、列表或哈希值等方式进行分区,提供了灵活的分区策略选择。
区别分析
- 功能不同:GROUP BY用于对数据进行分组和聚合,得到每个分组的统计结果。PARTITION BY用于将表或索引的数据划分为多个分区,以提高查询性能。
- 数据操作层面不同:GROUP BY操作在查询结果集上进行,不会改变数据表的物理存储结构。PARTITION BY操作在数据表或索引的存储层面进行,会改变数据的物理分布。
- 使用场景不同:GROUP BY适用于对查询结果进行分组和聚合操作,常用于统计分析、报表生成等场景。PARTITION BY适用于大表的数据管理和查询优化,常用于分布式存储、数据仓库等场景。
- group by是分组函数,partition by是分区函数
- 执行顺序不同:
常用sql关键字的执行顺序:
partition by作为窗口函数的一部分只能写于SELECT子句中,所以顺序要在GROUP BY之后
使用注意
- 在使用GROUP BY时,注意选择适当的聚合函数和列进行分组,并合理使用HAVING子句进行结果过滤。
- 在使用PARTITION BY时,考虑表的大小、查询频率和数据分布等因素,选择合适的分区策略。
- 注意对分区表进行维护和管理,及时调整分区策略以适应数据的变化。
总结
GROUP BY和PARTITION BY是MySQL中常用的关键字,用于数据的分组和分区操作。尽管它们在功能上有一定的相似性,但在实际应用中存在重要的区别。GROUP BY适用于对查询结果进行分组和聚合,常用于统计分析和报表生成等场景。PARTITION BY适用于大表的数据管理和查询优化,常用于分布式存储和数据仓库等场景。在实际使用中,我们应该根据具体需求选择合适的关键字,并结合最佳实践进行正确的数据处理和分析操作,以提高查询性能和数据管理效率。
* 此段内容均来源于网络搜索引用
e.g.1 学生排名

e.g.2 雇员排名

e.g.3 去除最大值、最小值后求平均值

e.g.4 去除最大值、最小值后求平均值(变式)

在对数据分组之后,取每组里面的最大值、最小值

e.g.1查询前三名的成绩

e.g.2 查询排在前两名的工资

e.g.1 成绩前40%的学生信息

e.g.2 用户访问次数

e.g.1 学生成绩累计求和


e.g.1 每组大于平均值

e.g.2 低于平均薪水的雇员信息

e.g.1 连续3次为球队得分的球员名单

e.g.2 连续出现N次的问题(举一反三)


e.g.3 连续访问记录

1.partition子句可以省略,省略就是不指定分组,只执行排序子句不分组
2.窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中
声明:以上涉及的题目和相关知识点均为作者完成 猴子 《SQL面试宝典》中例题练习的记录与总结,仅作日常参考使用。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/7439.html