Oracle分析函数Lead(),Lag()

本文详细介绍了Oracle分析函数Lead()和Lag()的语法结构及用法,包括参数说明、实例演示以及如何在不同场景中运用这些函数,特别是对于在一定条件下判断两条记录之间的时间差的需求提供了实用的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle分析函数Lead(),Lag()

 

其实这2个函数的作用非常好理解,Lead()就是取当前顺序的下一条记录,相对Lag()就是取当前顺序的上一行记录。

经常会有判断在一定条件下的两条记录之间的时间差这样的需求。

Lead()函数的用法和Lag()是一样的,所以只说明一个就可以了。

 

语法结构:

lead(value_expr [,offset][,default])over([query_partition_clause] order by Order_by_clause)

参数说明:

value_expr 值表达式,通常是字段,也可是是表达式。value_expr本身不支持分析函数,也就是lead不支持多层调用。

offset 偏移,应该是很熟悉的数学概念了,或者是相对偏移,表格来开当前行的第offset行,如果offset是整数就表示是顺序下的前第n行,如果是负数就是往后第n行。 如果不提供这个参数,就是默认为1.

default 默认值,如果没有找到,应该返回什么值的意思,有点类似nvl(col,value)。如果没有设置,且找不到,那么就返回Null

over  理解成在一个结果集范围内,如果后面的partition by为空,那么就是当前的结果集范围内。

query_partition_clause  分区语句,对结果集合分区的语句,是可选的,如果没有就是所有的一个分区。

Order_by_clause 排序语句 必须需要 ,形如order by xxx desc/asc

1、使用lag分析函数

SCOTT@yangdb> set pagesize 10000
SCOTT@yangdb> select ename,job,sal ,lag(sal) over(order by sal) last_sal fromemp;
ENAME     JOB             SAL   LAST_SAL
---------- --------- ---------- ----------
SMITH     CLERK            800     --此时没有设置default 值 则为空值
JAMES     CLERK           950        800
ADAMS     CLERK          1100        950
WARD      SALESMAN       1250       1100
MARTIN    SALESMAN       1250       1250
MILLER    CLERK          1300       1250
TURNER    SALESMAN       1500       1300
ALLEN     SALESMAN       1600       1500
CLARK     MANAGER        2450       1600
BLAKE     MANAGER        2850       2450
JONES     MANAGER        2975       2850
SCOTT     ANALYST        3000       2975
FORD      ANALYST        3000       3000
KING      PRESIDENT      5000       3000

14 rows selected.

 

2、使用lead分析函数
SCOTT@yangdb> select ename,job,sal,lead(sal) over(order by sal) last_sal from emp;
ENAME     JOB             SAL   LAST_SAL
---------- --------- ---------- ----------
SMITH     CLERK           800        950
JAMES     CLERK           950       1100
ADAMS     CLERK          1100       1250
WARD      SALESMAN       1250       1250
MARTIN    SALESMAN       1250       1300
MILLER    CLERK          1300       1500
TURNER    SALESMAN       1500       1600
ALLEN     SALESMAN       1600       2450
CLARK     MANAGER        2450       2850
BLAKE     MANAGER        2850       2975
JONES     MANAGER        2975       3000
SCOTT     ANALYST        3000       3000
FORD      ANALYST        3000       5000
KING      PRESIDENT       5000

14 rows selected.

lead 的offsetN 是以记录的第N行和第一做对比注意末尾的 null 值!

 

3、Lead和Lag函数也可以使用分组,以下是使用job 分组的例子:

SCOTT@yangdb> selectename,job,sal ,lead(sal,1) over(partition by job order by sal) last_sal fromemp;
ENAME     JOB             SAL   LAST_SAL
---------- --------- ---------- ----------
FORD      ANALYST        3000       3000
SCOTT     ANALYST         3000
SMITH     CLERK           800        950
JAMES     CLERK           950       1100
ADAMS     CLERK          1100       1300
MILLER    CLERK           1300
CLARK     MANAGER        2450       2850
BLAKE     MANAGER        2850       2975
JONES     MANAGER         2975
KING      PRESIDENT       5000
MARTIN    SALESMAN       1250       1250
WARD      SALESMAN       1250       1500
TURNER    SALESMAN        1500      1600
ALLEN     SALESMAN        1600

14 rows selected.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值