共计 2329 个字符,预计需要花费 6 分钟才能阅读完成。
概述
Oracle 函数系列:
Oracle 常见函数大全
Oracle- 分析函数之连续求和 sum(…) over(…)
Oracle- 分析函数之排序值 rank() 和 dense_rank()
Oracle- 分析函数之排序后顺序号 row_number()
Oracle- 分析函数之取上下行数据 lag() 和 lead()
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) preActionDate | |
from lead_table a ; |
进一步统计一下两者的相差天数
select caseid, | |
stepid, | |
actiondate, | |
nextactiondate, | |
nextactiondate - actiondate datebetween | |
from (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) preactiondate | |
from lead_table) ; |
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-11/136848.htm
正文完
星哥玩云-微信公众号
