mysql中的lead函数和over函数

打印 上一主题 下一主题

主题 830|帖子 830|积分 2490

mysql中的lead函数和over函数

作用

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

我们有一个销售表,有很多类型的产品,我们想要根据产品id分组,然后再根据产品销售时间排序,我们想要显示下个月的销售额,以及下个月增加的销售额。
上面这个场景需求就是可以利用lead函数联合over函数来实现。
实现方法

首先看一下我们的销售表结构,如下图:

然后看一下里面我们存储的数据,如下图:

接着来看下我们执行的sql语句如下:
  1. SELECT
  2.     product_id,
  3.     sales_date,
  4.     sales_amount,
  5.     LEAD(sales_amount) OVER (PARTITION BY product_id ORDER BY sales_date) AS next_sales_amount,
  6.     (LEAD(sales_amount) OVER (PARTITION BY product_id ORDER BY sales_date) - sales_amount) AS growth_amount
  7. FROM
  8.     sales_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行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表