前言
今天碰到一个需求对mysql数据做比较复杂的聚合查询,牛马小陈思索了半个小时用尽了GROUP BY 和 join也没能完美解决,于是想起了尘封在脑海里的【窗口函数】的概念,于是面向百度编程三分钟解决问题。
具体问题就不再展示了,本篇文章主要是记录一下mysql【窗口函数】的用法。
一、mysql窗口函数是什么?
窗口函数又名开窗函数,属于分析函数的一种。是一种在查询结果中进行聚合计算、排序和分组的高级技术。窗口函数可以在查询的结果集上进行窗口操作,提供了对数据的更灵活的处理和分析能力。
窗口函数可以在查询结果上进行聚合计算,而不会改变结果集的行数。窗口函数用于计算基于组(GROUP BY)的某种聚合值,它们与普通的聚合函数(如 SUM、AVG、COUNT)不同,普通的聚合函数通常会将结果简化为单个值,并且查询结果只有一行,而窗口函数可以在每一行上进行计算,保留原始查询结果的每一行。
使用窗口函数的基本语法如下:
窗口函数() OVER (PARTITION BY 列1, 列2, ... ORDER BY 排序列1, 排序列2, ...) [别名]
常用的窗口函数包括:
排名函数:ROW_NUMBER()、RANK() 和 DENSE_RANK()用于对数据进行排序并分配排名。
ROW_NUMBER():会为每一行分配一个唯一的数字排名。
RANK():会为相同数值的行分配相同的排名,但会跳过下一个排名。
DENSE_RANK():会为相同数值的行分配相同的排名,但不会跳过下一个排名。
错行函数:lead()、lag()函数用于获取当前行的前一行或后一行的值。
lead():返回当前行之后的某一行的值。
lag():返回当前行之前的某一行的值。
这些函数可以用于计算时间序列数据中的差异或趋势。
取值函数:First_value()、last_value()函数用于获取分组中的第一个值和最后一个值。
First_value():返回分组中的第一个值。
last_value():返回分组中的最后一个值。
这些函数通常用于计算移动平均或累计总和等聚合操作。
分箱函数:NTILE()函数将数据按照指定的桶数进行分箱。
例如,如果将数据分为4个桶,NTILE()函数会将数据分为四分之一,并将每个值分配到相应的桶中。这些函数可以用于创建数据的等宽分布。
请注意,窗口函数在 MySQL 8.0 版本中引入,如果您的 MySQL 版本较低,可能无法使用窗口函数。
二、深度剖析over开窗函数
本来想自己梳理一下发出来,不过看到一个大佬整理出来的文档非常清晰和完整了,于是我就不再多此一举了,用到的时候点个传送门直接飞过去。。。
给大佬倒咖啡,辛苦了。