微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[Oracle]Lead和Lag偏移量函数使用详解

Oracle有两个函数:LEAD和LAG,这两个函数都是用来计算偏移量的分析函数,这两个函数用法相同。


Oracle官方文档解释是:

LEADis an analytic function. It provides access to more than one row of a table at the same time without a self join. Given a series of rows returned from a query and a position of the cursor,provides access to a row at a given physical offset beyond that position.

LEAD函数一个分析函数,它可以在不用自连接的情况下,同时访问一个表的多行数据。查询返回的一系列的数据行和游标,LEAD函数在当前位置上根据偏移量访问该表中的另一行数据。

我们结合查询的示例,来看看这个函数的具体用法

1、lead函数首先根据 DEPTNO 部门分组并按照 HIREDATE 进行排序,NEXT_HIREDATE表示HIREDATE的下一个偏移量(偏移量认为1)。

比如ALLEN的HIREDATE是"1981-2-20",那么ALLEN的NEXT_HIREDATE的值就是"1981-2-22"(即WARD的HIREDATE值);

同样的,WARD的HIREDATE值是"1981-2-22",那么WARD的NEXT_HIREDATE值是"1981-5-1"(即BLAKE的HIREDATE值);

最后JAMES找不到下一个偏移量,所以NEXT_HIREDATE的认值就是NULL。

  1. --1、lead基本用法
  2. selecte.ename,
  3. e.deptno,
  4. e.hiredate,
  5. lead(e.hiredate,1,null)over(partitionbye.deptnoorderbye.hiredate)asnext_hiredate
  6. fromempe
  7. wheree.deptno=30;

2、上面的查询也可以不加partition by

--2、不包含partitionby的lead函数
  • SELECTe.ename,0);background-color:inherit;">lead(e.hiredate)over(FROMempe;


  • 3、Oracle 11g增强LEAD和LAG函数的语法,加入了{RESPECT|IGnorE}NULLS,如果LEAD的表达式结果为空,则返回的结果也为空,看下面这个例子。

    updateempe
  • sete.hiredate=NULL
  • wheree.empno='7698';
  • commit;
  • selecte.empno,
  • e.ename,NULL)over(partitionbye.empno)wheree.deptno=30;

  • 由于7698-BLAKE的HIREDATE的值为空,所有MARTIN的NEXT_HIREDATE的值也为空,系统认的是RESPECT NULLS,添加IGnorE NULLS后的结果如下。

    lead(e.hiredateignorenulls)over(partition

    新增的IGnorE NULLS功能,可以忽略NULL结果,去寻找另一个满足条件的结果。


    4、偏移量决定查询时向前或后便宜N个位置,函数认偏移量为1,我们也可以修改自定义的偏移量。

    --4、偏移量offset,认值=1,手动设置为2

  • asnext_hiredate
  • fromempe
  • wheredeptno=30;

  • 5、LEAD的偏移量如果超出了表的范围,则DEFAULT认返回NULL,我们可以手动设置一个固定的返回值,该值的数据类型必须与LEAD表达式类型一致。

    --5、lead函数的default参数

  • ottom:none;border-left:3px solid rgb(108,to_date('2013-01-01','yyyy-MM-dd'))over(partitionLAG分析函数用法基本与lEAD函数类型,只不过作用相反,大家可以在自己的机子上亲自实践一下,更多详细的信息请参考:http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions086.htm#SQLRF00656

  • 版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐