关于SQL的LAG()和LEAD()函数

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

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

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

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

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

不多说,来看看例子就懂了:
这是我随便造的一份数据,假设某人向银行借了一笔钱,分24期还钱。
在这里插入图片描述
其中:
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是选填。

结合聚合函数
在这里插入图片描述在这里插入图片描述

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

  • 48
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值