设为首页 收藏本站
查看: 392|回复: 0

[经验分享] oracle查询上一条(lag)、下一条(lead)

[复制链接]
YunVN网友  发表于 2016-8-16 06:40:48 |阅读模式
  
  Lag和Lead分析函数可以在同一次查询中取出N行的数据(Lag)和后N行的数据(Lead)作为独立的列。
  这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率。
  
  查询上一条
  语法结构

lag(value_expr [,offset][,default]) over([query_partition_clause] order by Order_by_clause)
  
  查询下一条
  语法结构

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 分区语句,对结果集合分区的语句,是可选的,如果没有就是所有的一个分区。
  如partition by columnName
  order_by_clause 排序语句 必须需要 ,形如order by xxx desc/asc
  
  例子:
  查询上一条,其中lagid只是个列别名
  

select lag(id,1,null) over (order by topflag desc, orderflag desc) lagid, tmpa.*
from article tmpa
  
  通过查询谁的上一条是我,来查询下一条

select tmplag.* from
(select lag(id,1,null) over (order by topflag desc, orderflag desc) lagid, tmpa.*
from article tmpa
where catalogid in (10652,10653,10654)) tmplag
where tmplag.lagid = 267045
  
  查询下一条,其中leadid只是个列别名

select lead(id,1,null) over (order by topflag desc, orderflag desc) leadid, tmpa.*
from article tmpa
  
  通过查询谁的下一条是我,来查询上一条

select tmplead.* from
(select lead(id,1,null) over (order by topflag desc, orderflag desc) leadid, tmpa.*
from article tmpa
where catalogid in (10652,10653,10654)) tmplead
where tmplead.leadid = 266168
  
  参考:
  oracle下lag和lead分析函数
http://blog.csdn.net/thinkscape/article/details/8290894
  Oracle分析函数Lead() Lag()
http://soft.chinabyte.com/database/39/12601039.shtml  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-258253-1-1.html 上篇帖子: Oracle主键、唯一键与唯一索引的区别 下篇帖子: 在Oracle中如何利用Rowid查找和删除表中的重复记录-数据库专栏,ORACLE
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表