您的位置:首页 > 数据库 > Oracle

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

2017-04-20 13:51 239 查看
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';

结果都是:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: