Oracle-分析函数之取上下行数据lag()和lead()
生活随笔
收集整理的這篇文章主要介紹了
Oracle-分析函数之取上下行数据lag()和lead()
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概述
ORACLE函數系列:
Oracle常見函數大全
Oracle-分析函數之連續求和sum(…) over(…)
Oracle-分析函數之排序值rank()和dense_rank()
Oracle-分析函數之排序后順序號row_number()
Oracle-分析函數之取上下行數據lag()和lead()
這兩個函數是偏移量函數,可以查出一個字段的上一個值或者下一個值,配合over來使用。
lead函數,這個函數是向上偏移.
lag函數是向下偏移一位.
語法
【語法】
lag(EXPR,<OFFSET>,<DEFAULT>) LEAD(EXPR,<OFFSET>,<DEFAULT>)【功能】表示根據COL1分組,在分組內部根據 COL2排序,而這個值就表示每組內部排序后的順序編號(組內連續的唯一的)
lead () 下一個值 lag() 上一個值
【參數】
- EXPR是從其他行返回的表達式
- OFFSET是缺省為1 的正數,表示相對行數。希望檢索的當前行分區的偏移量
- DEFAULT是在OFFSET表示的數目超出了分組的范圍時返回的值。
exp_str 是要做對比的字段
offset 是exp_str字段的偏移量 比如說 offset 為2 則 拿exp_str的第一行和第三行對比,第二行和第四行,依次類推,offset的默認值為1!
【說明】Oracle分析函數
栗子
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;數據規格:
輸出當前 和 之前 之后的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 ;進一步統計一下兩者的相差天數
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) ;總結
以上是生活随笔為你收集整理的Oracle-分析函数之取上下行数据lag()和lead()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle-分析函数之排序后顺序号ro
- 下一篇: Oracle增加修改删除字段/主键