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行。