LAG LEAD 取上下行数据分析函数

语法

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

关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号