ORACLE WITH AS 的使用

--WITH AS 的用法

--创建表
CREATE TABLE CHECK_IN 
(CID NUMBER PRIMARY KEY,
CSDATE DATE,
CEDATE DATE)

SELECT * FROM CHECK_IN;
DELETE  FROM CHECK_IN;
INSERT INTO CHECK_IN VALUES(1,'01-JAN-2021','13-JAN-2021');
INSERT INTO CHECK_IN VALUES(2,'13-JAN-2021','13-FEB-2021');
INSERT INTO CHECK_IN VALUES(3,'13-FEB-2021','13-MAR-2021');
INSERT INTO CHECK_IN VALUES(4,'04-APR-2021','13-APR-2021');
INSERT INTO CHECK_IN VALUES(5,'13-APR-2021','13-JUN-2021');
INSERT INTO CHECK_IN VALUES(6,'13-JUN-2021','13-JUL-2021');
INSERT INTO CHECK_IN VALUES(7,'20-JUL-2021','25-AUG-2021');
INSERT INTO CHECK_IN VALUES(8,'25-AUG-2021','13-SEP-2021');
INSERT INTO CHECK_IN VALUES(9,'3-SEP-2021','13-OCT-2021');
INSERT INTO CHECK_IN VALUES(10,'7-OCT-2021','13-OCT-2021');
INSERT INTO CHECK_IN VALUES(11,'16-NOV-2021','23-NOV-2021');

--定位连续值的范围 
SELECT A.* FROM CHECK_IN A,CHECK_IN B WHERE B.CSDATE=A.CEDATE

SELECT C.*,LAG(CEDATE)OVER(ORDER BY CEDATE)上次结束时间 FROM CHECK_IN C;
WITH A AS 
(SELECT C.*,LEAD(CSDATE)OVER(ORDER BY CSDATE)下次开始时间 FROM CHECK_IN C)
SELECT * FROM A WHERE A.下次开始时间<=A.CEDATE;


WITH A AS 
(SELECT C.*, LAG(CEDATE)OVER(ORDER BY CEDATE)上次结束时间 FROM CHECK_IN C),
B AS (SELECT A.*, CASE WHEN COALESCE(A.上次结束时间,TO_DATE('0001-01-01','yyyy-MM-dd'))>=A.CSDATE 
THEN 0 ELSE 1 END 状态 FROM A),
C AS (SELECT B.*,SUM(B.状态)OVER(ORDER BY CID) AS 组 FROM B)
SELECT C.组,MIN(C.CSDATE)开始时间,MAX(C.CEDATE)结束时间 FROM C GROUP BY C.组

SELECT A.组,MAX(CEDATE),MIN(CSDATE)FROM(
SELECT SUM(B.状态)OVER(ORDER BY CSDATE)组,B.* FROM(
SELECT C.*,LAG(CEDATE)OVER(ORDER BY CSDATE) AS 上次结束时间,
CASE WHEN LAG(CEDATE)OVER(ORDER BY CSDATE)>=C.CSDATE THEN 0 ELSE 1 END AS 状态
   FROM CHECK_IN C)B)A GROUP BY A.组 ORDER BY A.组;
   
   
   
--LISTAGG+九九乘法表
WITH A AS 
     (SELECT LEVEL AS LV FROM DUAL CONNECT BY LEVEL<=9)
     
     SELECT LVA.LV,LVB.LV,
      TO_CHAR(LVA.LV||'*'||LVB.LV||'='||LVA.LV*LVB.LV) 
      FROM A LVA,A LVB
      WHERE LVA.LV<=LVB.LV
      ORDER BY LVB.LV,LVA.LV
   

WITH A AS 
     (SELECT LEVEL AS LV FROM DUAL CONNECT BY LEVEL<=9),
     B AS
     (SELECT LVA.LV AS AVALUE,LVB.LV AS BVALUE,
      TO_CHAR(LVA.LV||'*'||LVB.LV||'='||RPAD(LVA.LV*LVB.LV,2,'    '))AS THISVALUE
      FROM A LVA,A LVB
      WHERE LVA.LV<=LVB.LV
      ORDER BY LVB.LV,LVA.LV
      )
      SELECT B.BVALUE,
      LISTAGG(B.THISVALUE,'  ')
      WITHIN GROUP(ORDER BY B.AVALUE)九九乘法表 
      FROM B GROUP BY B.BVALUE


--此外,还可以使用WITH AS 作为子查询。日后有空会更新
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知道叫什麽名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值