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

news/2024/6/18 3:25:05 标签: oracle, sql, insert, table, date, 报表

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

先创建示例表:

--  Create table
create   table  LEAD_TABLE
(
  CASEID     
VARCHAR2 ( 10 ),
  STEPID     
VARCHAR2 ( 10 ),
  ACTIONDATE DATE
)
tablespace COLM_DATA
  pctfree 
10
  initrans 
1
  maxtrans 
255
  storage
  (
    initial 64K
    minextents 
1
    maxextents unlimited
  );

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

结果如下:

Case1    Step1     2007 - 1 - 1     Step2     2007 - 1 - 2         
Case1    Step2    
2007 - 1 - 2     Step3     2007 - 1 - 3     Step1     2007 - 1 - 1
Case1    Step3    
2007 - 1 - 3     Step4     2007 - 1 - 4     Step2     2007 - 1 - 2
Case1    Step4    
2007 - 1 - 4     Step5     2007 - 1 - 5     Step3     2007 - 1 - 3
Case1    Step5    
2007 - 1 - 5     Step4     2007 - 1 - 6     Step4     2007 - 1 - 4
Case1    Step4    
2007 - 1 - 6     Step6     2007 - 1 - 7     Step5     2007 - 1 - 5
Case1    Step6    
2007 - 1 - 7                                        Step4     2007 - 1 - 6
Case2    Step1    
2007 - 2 - 1     Step2     2007 - 2 - 2         
Case2    Step2    
2007 - 2 - 2     Step3     2007 - 2 - 3     Step1     2007 - 2 - 1
Case2    Step3    
2007 - 2 - 3                                        Step2     2007 - 2 - 2

 

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

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

结果如下:

Case1    Step1     2007 - 1 - 1      2007 - 1 - 2      1
Case1    Step2    
2007 - 1 - 2      2007 - 1 - 3      1
Case1    Step3    
2007 - 1 - 3      2007 - 1 - 4      1
Case1    Step4    
2007 - 1 - 4      2007 - 1 - 5      1
Case1    Step5    
2007 - 1 - 5      2007 - 1 - 6      1
Case1    Step4    
2007 - 1 - 6      2007 - 1 - 7      1
Case1    Step6    
2007 - 1 - 7         
Case2    Step1    
2007 - 2 - 1      2007 - 2 - 2      1
Case2    Step2    
2007 - 2 - 2      2007 - 2 - 3      1
Case2    Step3    
2007 - 2 - 3         

 

 

 

http://www.niftyadmin.cn/n/605021.html

相关文章

java 垃圾回收机制gc garbage collection

友链 年代回收机制 年轻一代的对象分为两部分 伊甸园和存活者(Fromspace和tospace) 所有的对象都产生自年轻一代中的伊甸园 当第一轮gc过后,仍然幸存的伊甸园区中的对象就会被移动到存活者区中 依次类推,在经过数轮gc之后&…

禁用windows 445端口

友链 sc stop lanmanserver sc config lanmanserver startdisabled以管理员身份执行上面两条命令 然后重启电脑即可

巨型文件免費傳送

電腦用戶經常透過互聯網傳送檔案,一般情况下我們可以使用電子郵件輕易辦到,不過若需要處理巨型檔案的時候,由於電郵一般設有容量限制,這時候就要另?#92;他法了。 所傳檔案容量最高1GB 「開心小發現」知道,互聯網上有一…

[Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集

Oracle支持通过ref游标在调用存储过程后返回结果集, 使用游标在内存消耗以及时间上都要大大的优于返回数组变量的做法! 示例如下:数据库方面,建立一个Package createorreplacepackage ref_cur_demo istype rc isref cursor; procedureref_cursor(p_owne…

在 Web 项目中应用 Apache Shiro

2019独角兽企业重金招聘Python工程师标准>>> 用户权限模型 在揭开 Shiro 面纱之前,我们需要认知用户权限模型。本文所提到用户权限模型,指的是用来表达用户信息及用户权限信息的数据模型。即能证明“你是谁?”、“你能访问多少受保…

perl embeded into c++

发信人:wideexpress(冬瓜),信区:Perl 标题:菜鸟历程——将perl嵌入到vc 发信站:水木社区(SatMay2823:36:252005),站内因为要在vc环境下进行文本解析,所以想将perl嵌入到vc环境中来,在网上看到ActivePerl支持Windows环境,于是下了ActivePerl5.…

C语言模拟实现ls -al命令

友链 C代码如下&#xff1a; #include <stdio.h>#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <pwd.h> #include <grp.h> #include <time.h> #include <string.h>// 模拟实现ls -al命令 // …

拥有一个属于自己的个性地图名片

今天无意之间找到了一个网站&#xff1a; http://www.mapbar.com/mapcard/index.jsp 他能让用户自行标注个人所在地&#xff0c;以电子地图形式直观显现。丰富信息简便录入&#xff0c;三分钟您即可拥有以地图为特色的个人名片。能够帮您在网络社会中展示自己的个性化信息和位…