对这个函数使用比较少,今天具体来看下。

定义:Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。

嗯,反正每次看这些定义啥的都有点拗口,通俗点来说,就相当于表的自关联。

假设你要看你自己每个月的账单情况,顺便和历史账单做个对比。
取某一个月,Lag()呢就是跟这个月之前的月份去对比,Lead()就是跟这个月之后的月份去对比。
还可以结合sum()或者max()聚合函数一起看数据。

(一)lag(a,1,0) over(partition by b order by c)

不多说,来看看例子就懂了:

这是我随便造的一份数据,假设某人向银行借了一笔钱,分24期还钱。

lead函数 sparksql lead函数 mysql_lead函数 sparksql


其中:

lag(repay_amount,1,0) over(order by cur_stage) 是根据字段cur_stage排序

当cur_stage = 16的时候,它的上一期是15,取到值为第15期的repay_amount = 1341.34

当cur_stage = 17的时候,它的上一期是16,取到值为第16期的repay_amount = 858.35

当cur_stage = 18的时候,它的上一期是17,取到值为第17期的repay_amount = 858.35

当cur_stage = 19的时候,它的上一期是18,取到值为第18期的repay_amount = 858.35

lag(repay_amount,1,0)中第二个参数是偏移量的意思,就是取上一期。

当cur_stage = 1的时候,它的上一期因为没有,所以为空,这里第二个参数是为空的默认值取0。

lag(repay_amount,2,-2) over(order by cur_stage) 当cur_stage = 16的时候,它的上上一期是14,取到值为第14期的repay_amount = 1341.34
当cur_stage = 17的时候,它的上上一期是15,取到值为第15期的repay_amount = 1341.34
当cur_stage = 18的时候,它的上上一期是16,取到值为第16期的repay_amount = 858.35
当cur_stage = 19的时候,它的上上一期是17,取到值为第17期的repay_amount = 858.35
这里的偏移量为2,第1,2期因为没有上上一期,所以空值默认为-2。

lag(repay_amount,3,-3) over(order by cur_stage) 当cur_stage = 16的时候,它的往前3期是13,取到值为第13期的repay_amount = 1341.34
当cur_stage = 17的时候,它的往前3期是14,取到值为第14期的repay_amount = 1341.34
当cur_stage = 18的时候,它的往前3期是15,取到值为第15期的repay_amount = 1341.34
当cur_stage = 19的时候,它的往前3期是16,取到值为第16期的repay_amount = 858.35
这里的偏移量为3,第1,2,3期因为没有往前3期,所以空值默认为-3。

同理,lead函数就是往后偏移。参数2和参数3是选填。

结合聚合函数

lead函数 sparksql lead函数 mysql_聚合函数_02

lead函数 sparksql lead函数 mysql_聚合函数_03

总之呢,这个函数还是很好用的,分析的时候一目了然。