LAG(EXPR, <OFFSET>, <DEFAULT>)
LEAD(EXPR, <OFFSET>, <DEFAULT>)
表示根据 COL1 分组,在分组内部根据 COL2 排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)。
LEAD() 下一个值
LAG()上一个值
EXPR 是从其他行返回的表达式
OFFSET 是缺省为1 的正数,表示相对行数。希望检索的当前行分区的偏移量
DEFAULT 是在 OFFSET 表示的数目超出了分组的范围时返回的值
无
-- 创建表格 SQL> create table lead_table( 2 CASEID VARCHAR2(10), 3 STEPID VARCHAR2(10), 4 ACTIONDATE DATE); 表已创建。 -- 插入数据 insert into LEAD_TABLE values('Case1','Step1',to_date('20070101','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step2',to_date('20070102','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step3',to_date('20070103','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step4',to_date('20070104','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step5',to_date('20070105','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step4',to_date('20070106','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step6',to_date('20070101','yyyy-mm-dd')); insert into LEAD_TABLE values('Case1','Step1',to_date('20070201','yyyy-mm-dd')); insert into LEAD_TABLE values('Case2','Step2',to_date('20070202','yyyy-mm-dd')); insert into LEAD_TABLE values('Case2','Step3',to_date('20070203','yyyy-mm-dd')); commit;
还可以进一步统计一下两者的相差天数
SQL> select caseid, stepid, actiondate, nextactiondate, nextactiondate-actiondate datebetween from ( 2 select caseid, stepid, actiondate, 3 lead(stepid) over (partition by caseid order by actiondate) nextstepid, 4 lead(actiondate) over (partition by caseid order by actiondate) nextactiondate, 5 lag(stepid) over (partition by caseid order by actiondate) prestepid, 6 lag(actiondate) over (partition by caseid order by actiondate) preactiondate 7 from lead_table 8 ); CASEID STEPID ACTIONDATE NEXTACTIONDATE DATEBETWEEN ---------- ---------- -------------- -------------- ----------- Case1 Step1 01-1月 -07 01-1月 -07 0 Case1 Step6 01-1月 -07 02-1月 -07 1 Case1 Step2 02-1月 -07 03-1月 -07 1 Case1 Step3 03-1月 -07 04-1月 -07 1 Case1 Step4 04-1月 -07 05-1月 -07 1 Case1 Step5 05-1月 -07 06-1月 -07 1 Case1 Step4 06-1月 -07 01-2月 -07 26 Case1 Step1 01-2月 -07 Case2 Step2 02-2月 -07 03-2月 -07 1 Case2 Step3 03-2月 -07 已选择10行。
每一条记录都能连接到上/下一行的内容,lead() 下一个值 lag() 上一个值。
SQL> select caseid,stepid,actiondate, 2 lead(stepid) over (partition by caseid order by actiondate) nextstepid, 3 lead(actiondate) over (partition by caseid order by actiondate) nextactiondate, 4 lag(stepid) over (partition by caseid order by actiondate) prestepid, 5 lag(actiondate) over (partition by caseid order by actiondate) preactiondate 6 from lead_table; CASEID STEPID ACTIONDATE NEXTSTEPID NEXTACTIONDATE PRESTEPID PREACTIONDATE ---------- ---------- -------------- ---------- -------------- ---------- -------------- Case1 Step1 01-1月 -07 Step6 01-1月 -07 Case1 Step6 01-1月 -07 Step2 02-1月 -07 Step1 01-1月 -07 Case1 Step2 02-1月 -07 Step3 03-1月 -07 Step6 01-1月 -07 Case1 Step3 03-1月 -07 Step4 04-1月 -07 Step2 02-1月 -07 Case1 Step4 04-1月 -07 Step5 05-1月 -07 Step3 03-1月 -07 Case1 Step5 05-1月 -07 Step4 06-1月 -07 Step4 04-1月 -07 Case1 Step4 06-1月 -07 Step1 01-2月 -07 Step5 05-1月 -07 Case1 Step1 01-2月 -07 Step4 06-1月 -07 Case2 Step2 02-2月 -07 Step3 03-2月 -07 Case2 Step3 03-2月 -07 Step2 02-2月 -07 已选择10行。