当前位置:网站首页 > 技术博客 > 正文

开窗函数详解



目录

一、什么是窗口函数

窗口函数的定义

窗口函数的语法格式

二、窗口函数的分类

专用窗口函数

聚合函数作为窗口函数

偏移分析函数

三、窗口函数的功能

在不减少原表的行数的基础上同时具有分组和排序的功能

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面试宝典》中例题练习的记录与总结,仅作日常参考使用。

  • 上一篇: hashset并集
  • 下一篇: java什么是代理模式
  • 版权声明


    相关文章:

  • hashset并集2025-05-04 11:01:01
  • oracle数据库expdp命令2025-05-04 11:01:01
  • okgot it2025-05-04 11:01:01
  • sql数据库游标的使用步骤2025-05-04 11:01:01
  • linux桌面系统哪个好2025-05-04 11:01:01
  • java什么是代理模式2025-05-04 11:01:01
  • c++右移运算符2025-05-04 11:01:01
  • 服务器性能监控命令2025-05-04 11:01:01
  • stw12025-05-04 11:01:01
  • python课程教学2025-05-04 11:01:01