MySQL中窗口函数的使用

MySQL中窗口函数的使用,第1张

MySQL的窗口函数最主要作用是对数据进行分组 *** 作(可以进行分组排序,求TopN,移动平均,聚合计算等),也就是相当于说在当前的详细级别视图里,对更低级别的数据进行计算呈现(可以与Tableau的表计算函数进行对比学习),比如说目前的表格是全国数据,但是要对不同省份的数据进行分组计算,这个时候使用窗口函数就会很方便。

在MySQL中,窗口函数要在8.0版本之后才能使用,如果是低版本的话,只能使用设置变量的方式完成以上内容的实现,设置变量在逻辑上会比窗口函数更加难以理解和使用,使用窗口函数可以大大的提高效率。

在很多SQL的教程中,说到窗口函数的时候,都只是说窗口函数的排序优势而已,但是在实际工作中,其用处远远不止这些。

以下为窗口函数的情况:

  窗口函数(window functions),也叫分析函数和OLAP函数,MySQL在8.0之后开始支持窗口函数。窗口函数可以用来对数据进行实时分析处理,和group by有类似之处,其区别在于窗口会对每个分组之后的数据按行进行分别 *** 作,而group by一般对分组之后的函数使用聚合函数汇总,做不到对不同的group中的行数据进行分别 *** 作。这就简单介绍几种常见的MySQL窗口函数。下表中列出了几种常见的窗口函数,并对其基本功能进行了描述。接下来我们会以一段示例,来展示MySQL中窗口函数的用途和效果。

  假设我们存在一张如下的员工工资表,接下来我们将以这张表对窗口函数的使用方法进行简单的演示。

  窗口函数的语法如下,所有的窗口函数均遵循以下语法:

其中 frame_clause 语法如下。

接下来我们将展示一些场景的窗口函数的用法和效果。

示例: 对所有员工按照薪资降序排序,并给出对应的row_number、rank和dense_rank的排名

示例: 对每个部门的员工按照薪资降序排序,并给出对应的row_number、rank和dense_rank的排名

示例: 对所有员工按照薪资降序排序,并给出对应的row_number、rank和dense_rank的排名,最终结果按照员工号进行排序输出。

示例: 找出每个部门工资最高的人。

示例: a.将所有员工按照工资递增的顺序分成4组。b.根据员工入职日期升序分成7组。

示例: 获取每个部门,按工资从低到高得累计和。

示例: 获取每个部门得工资累计和。

示例: 获取整个公司的薪资按照薪资递增的累计和。

示例: 获取整个公司的薪资按照薪资递增的前两行和后一行范围内的薪资和。

示例: 每个部门的平均工资。

示例: 获取整个公司的薪资按照薪资递增的前两行和后一行范围内的薪资平均值。

示例: 根据薪资排序,获取CUME_DIST()和PERCENT_RANK()

示例: a. 获取每个人入职前一行的数据,默认值为"2021-01-01"b. 获取每个人入职前两行的数据,不设置默认值c. 获取每个人入职后一行的数据,默认值为"2022-01-01"d. 获取每个人入职后两行的数据,不设置默认值

示例: a. 按照入职日期顺序排序,找出当前每个部门最先入职的人的薪资。b. 按照入职日期顺序排序,找出当前每个部门最后入职的人的薪资。

示例: a.获取截至当前工资第二高的人的工资。b.获取第二个入职的人的工资。

一枚小产品的学习记录

在做sql练习题时了解到的新函数,做个简要的记录,若有不严谨的地方,请指正。

mysql 8.0以上版本才支持窗口函数

以下是个人总结

另外:over(partition by字段1 order by 字段2)中的partition by 字段1 是可以省略的但是order by 字段2 不可省略

详细演示见下文:

本文内使用到的建表、插入数据sql 可在我写的sql面试50题的第一篇文章内找到.

按各科成绩进行排序,并显示排名

#rank()over()的使用

#执行结果如下

#rank()over()的使用,不使用partition by的效果

#执行结果如下

#row_number()over()的使用

#执行结果如下

#dense_rank()over()的使用

#执行结果如下

#****与group by 共同使用

#对学生总成绩进行从大到小排序

#执行结果如下


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8702665.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存