[Oracle]高效的SQL语句之分析函数(四)--lag()/lead()

本文介绍如何使用Oracle数据库中的分析函数lead()和lag()来获取表中每条记录的前驱和后继信息,并通过示例展示了如何计算相邻记录间的日期差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列文章导航

[Oracle]高效的SQL语句之分析函数(一)--sum()

[Oracle]高效的SQL语句之分析函数(二)--max()

[Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()

[Oracle]高效的SQL语句之分析函数(四)--lag()/lead()

有时候报表上面需要显示该笔操作的上一步骤或者下一步骤的详细信息,这个时候可以按照下面的做法:

先创建示例表:

-- Createtable
create table LEAD_TABLE
(
CASEID
VARCHAR2 ( 10 ),
STEPID
VARCHAR2 ( 10 ),
ACTIONDATEDATE
)
tablespaceCOLM_DATA
pctfree
10
initrans
1
maxtrans
255
storage
(
initial64K
minextents
1
maxextentsunlimited
);

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 ;

每一条记录都能连接到上/下一行的内容

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

结果如下:

Case1Step1 2007 - 1 - 1 Step2 2007 - 1 - 2
Case1Step2
2007 - 1 - 2 Step3 2007 - 1 - 3 Step1 2007 - 1 - 1
Case1Step3
2007 - 1 - 3 Step4 2007 - 1 - 4 Step2 2007 - 1 - 2
Case1Step4
2007 - 1 - 4 Step5 2007 - 1 - 5 Step3 2007 - 1 - 3
Case1Step5
2007 - 1 - 5 Step4 2007 - 1 - 6 Step4 2007 - 1 - 4
Case1Step4
2007 - 1 - 6 Step6 2007 - 1 - 7 Step5 2007 - 1 - 5
Case1Step6
2007 - 1 - 7 Step4 2007 - 1 - 6
Case2Step1
2007 - 2 - 1 Step2 2007 - 2 - 2
Case2Step2
2007 - 2 - 2 Step3 2007 - 2 - 3 Step1 2007 - 2 - 1
Case2Step3
2007 - 2 - 3 Step2 2007 - 2 - 2

还可以进一步统计一下两者的相差天数

select caseid,stepid,actiondate,nextactiondate,nextactiondate - actiondatedatebetween 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)

结果如下:

Case1Step1 2007 - 1 - 1 2007 - 1 - 2 1
Case1Step2
2007 - 1 - 2 2007 - 1 - 3 1
Case1Step3
2007 - 1 - 3 2007 - 1 - 4 1
Case1Step4
2007 - 1 - 4 2007 - 1 - 5 1
Case1Step5
2007 - 1 - 5 2007 - 1 - 6 1
Case1Step4
2007 - 1 - 6 2007 - 1 - 7 1
Case1Step6
2007 - 1 - 7
Case2Step1
2007 - 2 - 1 2007 - 2 - 2 1
Case2Step2
2007 - 2 - 2 2007 - 2 - 3 1
Case2Step3
2007 - 2 - 3

博文来源:http://blog.youkuaiyun.com/huanghui22/archive/2007/05/03/1595169.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值