oracle中lag()函数和lead()函数的用法

lag和lead函数可以在同一次查询中取出同一字段的前N行数据(lag)和后N行数据(lead)。这种字段可以使用对相同表的表连接来实现,不过使用lag和lead函数具有更高的效率。

语法:

LAG(EXP_STR,OFFSET,DEFVAL)OVER()

LEAD(EXP_STR,OFFSET,DEFVAL)OVER()
EXP_STR:要取的列
OFFSET: 取偏移后的第几行数据
DEFVAL:没有符合条件的默认值

例如:

脚本一:

--使用相同的表连接来实现

select a.c_month,a.c_soto, a.kpi_value, a1.kpi_value kpi_value_s --上月
  from dm_custbd_index_month a
  left join dm_custbd_index_month a1
    on a1.index_id = 'CUSIND_FUL001'
   and a.c_soto = a1.c_soto
   and a.c_month = a1.c_month + 1
 where a.index_id = 'CUSIND_FUL001'
   and a.c_soto = '8800155164';

-----------

脚本二:

--使用lag函数来实现

 select a.c_month,a.c_soto,a.kpi_value,lag(a.kpi_value,1)over(order by a.c_month) --上月
     from dm_custbd_index_month a
    where a.index_id = 'CUSIND_FUL001'
      and a.c_soto = '8800155164';

这两个脚本的查询结果是一样的,都是查上个月的指标值。相对来说脚本二代码简单而且执行效率更高。 结果:



lead()函数求后N行数据,同理:


select a.c_month,a.c_soto, a.kpi_value, a1.kpi_value kpi_value_x --下月
  from dm_custbd_index_month a
  left join dm_custbd_index_month a1
    on a1.index_id = 'CUSIND_FUL001'
   and a.c_soto = a1.c_soto
   and a.c_month = a1.c_month- 1
 where a.index_id = 'CUSIND_FUL001'
   and a.c_soto = '8800155164';
   
   
   select a.c_month,a.c_soto,a.kpi_value,lead(a.kpi_value,1)over(order by a.c_month)  kpi_value_x--下月
     from dm_custbd_index_month a
    where a.index_id = 'CUSIND_FUL001'
      and a.c_soto = '8800155164';


结果都是:






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值