Oracle分析函数之LEAD和LAG

时间:2023-03-08 22:35:13
LAG 访问结果集中当前行之前的行 LAG (value_expr [,offset] [,default])OVER ( [ partition_by_clause ] order_by_clause )
LEAD 访问结果集中当前后之后的行 lead(value_expr [,offset][,default]) over([partition_by_clause] order by Order_by_clause)
参数值说明:
value_expr 值表达式,通常是字段,也可是是表达式。value_expr本身不支持分析函数,也就是lead不支持多层调用。
offset 偏移量,如果offset是正数表示顺序下的第几个,如果是负数就是反顺序的第几个。 如果不提供这个参数,就是默认1.
default 默认值,如果没有找到offset所指定的值,就返回default值。如果没有设置,且找不到,那么就返回Null
下面是个简单的例子:
SQL> select deptno,
2 sal,
3 ename,
4 lead(ename, 1, 'lead_ename') over(partition by deptno order by sal) lead_ename,
5 lag(ename, 1, 'lag_ename') over(partition by deptno order by sal) lag_ename
6 from emp;
    DEPTNO        SAL ENAME      LEAD_ENAME LAG_ENAME
---------- ---------- ---------- ---------- ----------
10 1300 MILLER CLARK lag_ename
10 2450 CLARK KING MILLER
10 5000 KING lead_ename CLARK
20 800 SMITH JONES lag_ename
20 2975 JONES FORD SMITH
20 3000 FORD lead_ename JONES
30 950 JAMES WARD lag_ename
30 1250 WARD MARTIN JAMES
30 1250 MARTIN TURNER WARD
30 1500 TURNER ALLEN MARTIN
30 1600 ALLEN BLAKE TURNER
30 2850 BLAKE lead_ename ALLEN 已选择12行。
上面例子说明:lead和lag按deptno分组,并在每个分组里按sal列排序。
lead(ename, 1, 'lead_ename'),表示取当前行下一个ename值,如果找不到就用'lead_ename'字符串替代;
lag(ename,1,'lag_ename'),表示取当前行前一个ename值,如果找不到就用'lag_ename'字符串取代。