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

来源:互联网 发布:五笔教材 知乎 编辑:程序博客网 时间:2024/05/24 03:20

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';


结果都是:






0 0
原创粉丝点击