您的位置:首页 > 科技 > IT业 > mysql中的lead函数和over函数

mysql中的lead函数和over函数

2024/10/5 20:17:07 来源:https://blog.csdn.net/qq_45950109/article/details/139860458  浏览:    关键词:mysql中的lead函数和over函数

文章目录

  • mysql中的lead函数和over函数
    • 作用
    • 需求场景
    • 实现方法
    • group by分组和使用over函数分组有什么区别?

mysql中的lead函数和over函数

作用

over函数是用来分组加排序的,然后等over函数分好组排好序之后,再使用lead函数去找当前分组内的下一行数据的某个字段值,具体是哪个字段由over函数指定,如果当前分组内没有下一条数据的话,那么返回null空值。

需求场景

我们有一个销售表,有很多类型的产品,我们想要根据产品id分组,然后再根据产品销售时间排序,我们想要显示下个月的销售额,以及下个月增加的销售额。

上面这个场景需求就是可以使用lead函数结合over函数来实现。

实现方法

首先看一下我们的销售表结构,如下图:
在这里插入图片描述
然后看一下里面我们存储的数据,如下图:
在这里插入图片描述
接着来看下我们执行的sql语句如下:

SELECTproduct_id,sales_date,sales_amount,LEAD(sales_amount) OVER (PARTITION BY product_id ORDER BY sales_date) AS next_sales_amount,(LEAD(sales_amount) OVER (PARTITION BY product_id ORDER BY sales_date) - sales_amount) AS growth_amount
FROMsales_data;

我们上面查询的时候追加了两个字段,一个是next_sales_amount,也就是分组内下一条数据的销售额;另外一个是growth_amount,也就是销售额增长量,也就是分组内下一条数据的销售额减去当前销售额;

over函数的功能:现根据product_id产品id进行分组,分组完之后又根据sales_date销售日期进行排序,然后取出当前行的销售额sales_amount;
lead函数的功能:取出当前分组的下一条数据的某个字段的值,如果当前分组内已经是最后一条数据了,那么会返回null。

上面的sql语句的执行结果,如下图:
在这里插入图片描述

group by分组和使用over函数分组有什么区别?

1.输出结果不同

  • over函数:over函数允许在不减少结果集行数的情况下添加聚合列。即每行都可以保留原有的列值的同时,增加额外的分析结果列,比如说下一条数据是多少,或者是下一条数据比起当前数据的增长额是多少。
  • group by子句:group by子句则将数据汇总为较少的行,每个分组只返回一行聚合结果,因此,它的输出行通常会比表的原始行数要少,适用于需要对数据进行高度汇总的情况。比如在student学生表中,计算每个班级的学生的平均分,这个使用group by子句先要根据班级id进行分组,然后再使用avg(score)聚合函数计算平均分,原始数据可能有540行,如果一个班级90人的话,那么使用group by之后的输出结果只会有6行,因为只有两个班级嘛!但是如果是使用over函数进行班级分组的话,那么输出结果行数仍会有540行。

2.适用场景不同

  • over函数:适用于需要同时查看原始行和聚合数据的场景,输出结果中不会少原始行,并且也会新增聚合数据。例如,在销售数据表中计算每个产品在连续月份中的销售额增长情况,可以使用lead函数结合over函数来实现。
  • group by子句:适用于需要对数据进行分组并汇总的场景。例如,计算每个部门的总薪水时,使用group by子句可以直接得到每个部门的薪水总和,而不显示每个员工的薪水详情。可能你的员工表的数据有1000行,但是公司只有36个部门,那么你的输出结果行数就只有36行。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com