Oracle-分析函数之取上下行数据lag()和lead()
生活随笔
收集整理的這篇文章主要介紹了
Oracle-分析函数之取上下行数据lag()和lead()
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
概述
ORACLE函數(shù)系列:
Oracle常見函數(shù)大全
Oracle-分析函數(shù)之連續(xù)求和sum(…) over(…)
Oracle-分析函數(shù)之排序值rank()和dense_rank()
Oracle-分析函數(shù)之排序后順序號row_number()
Oracle-分析函數(shù)之取上下行數(shù)據(jù)lag()和lead()
這兩個函數(shù)是偏移量函數(shù),可以查出一個字段的上一個值或者下一個值,配合over來使用。
lead函數(shù),這個函數(shù)是向上偏移.
lag函數(shù)是向下偏移一位.
語法
【語法】
lag(EXPR,<OFFSET>,<DEFAULT>) LEAD(EXPR,<OFFSET>,<DEFAULT>)【功能】表示根據(jù)COL1分組,在分組內(nèi)部根據(jù) COL2排序,而這個值就表示每組內(nèi)部排序后的順序編號(組內(nèi)連續(xù)的唯一的)
lead () 下一個值 lag() 上一個值
【參數(shù)】
- EXPR是從其他行返回的表達(dá)式
- OFFSET是缺省為1 的正數(shù),表示相對行數(shù)。希望檢索的當(dāng)前行分區(qū)的偏移量
- DEFAULT是在OFFSET表示的數(shù)目超出了分組的范圍時返回的值。
exp_str 是要做對比的字段
offset 是exp_str字段的偏移量 比如說 offset 為2 則 拿exp_str的第一行和第三行對比,第二行和第四行,依次類推,offset的默認(rèn)值為1!
【說明】Oracle分析函數(shù)
栗子
create table LEAD_TABLE (CASEID VARCHAR2(10),STEPID VARCHAR2(10),ACTIONDATE DATE ) insert into LEAD_TABLE values('Case1','Step1',to_date('20161101','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step2',to_date('20161102','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step3',to_date('20161103','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step4',to_date('20161104','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step5',to_date('20161105','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step4',to_date('20161106','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step6',to_date('20161107','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step1',to_date('20161201','yyyy-mm-dd')); insert into LEAD_TABLE values('Case2','Step2',to_date('20161202','yyyy-mm-dd')); insert into LEAD_TABLE values('Case2','Step3',to_date('20161203','yyyy-mm-dd'));commit;數(shù)據(jù)規(guī)格:
輸出當(dāng)前 和 之前 之后的date 和 step
select a.caseid ,a.stepid as currentStepID,a.actiondate as currentActionDate,lead(stepid) over(partition by a.caseid order by a.stepid) nextStep,lead(actiondate) over(partition by a.caseid order by a.stepid) nextActionDate,lag(stepid) over(partition by a.caseid order by a.stepid) preStep,lag(actiondate) over(partition by a.caseid order by a.stepid) preActionDatefrom lead_table a ;進(jìn)一步統(tǒng)計一下兩者的相差天數(shù)
select caseid,stepid,actiondate,nextactiondate,nextactiondate - actiondate datebetweenfrom (select caseid,stepid,actiondate,lead(stepid) over(partition by caseid order by actiondate) nextstepid,lead(actiondate) over(partition by caseid order by actiondate) nextactiondate,lag(stepid) over(partition by caseid order by actiondate) prestepid,lag(actiondate) over(partition by caseid order by actiondate) preactiondatefrom lead_table) ;總結(jié)
以上是生活随笔為你收集整理的Oracle-分析函数之取上下行数据lag()和lead()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle-分析函数之排序后顺序号ro
- 下一篇: Oracle增加修改删除字段/主键