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';
结果都是: