首页 > 解决方案 > 使用 LEAD 函数提取数据减去天数

问题描述

我有PRODUCTINFO2 列的表:PRODUCTID (NUMBER)ALLOWFROM (DATE)现在我需要再插入一列ALLOWTO (DATE),这等于ALLOWFROM下一行减去 1 天。如果,没有下一个ALLOWFROM,应该打印出来。PRODUCTID'01-01-1900'

CREATE TABLE PRODUCTINFO (
    PRODUCTID NUMBER (8,0)
    ALLOWFROM DATE    
);

INSERT INTO PRODUCTINFO
 (PRODUCTID, ALLOWFROM)
VALUES (1, '05.01.2018')

INSERT INTO PRODUCTINFO
 (PRODUCTID, ALLOWFROM)
VALUES (1, '06.05.2018')

INSERT INTO PRODUCTINFO
 (PRODUCTID, ALLOWFROM)
VALUES (1, '06.10.2018')

INSERT INTO PRODUCTINFO
 (PRODUCTID, ALLOWFROM)
VALUES (1, '06.20.2018')

INSERT INTO PRODUCTINFO
 (PRODUCTID, ALLOWFROM)
VALUES (2, '05.01.2018')

INSERT INTO PRODUCTINFO
 (PRODUCTID, ALLOWFROM)
VALUES (2, '06.18.2018')

INSERT INTO PRODUCTINFO
 (PRODUCTID, ALLOWFROM)
VALUES (3, '05.01.2018')

INSERT INTO PRODUCTINFO
 (PRODUCTID, ALLOWFROM)
VALUES (3, '06.08.2018')

我尝试执行此脚本,但没有结果:

SELECT PRODUCTID, ALLOWFROM,
    LEAD(ALLOWTO, 3,'01-01-1900') OVER (ORDER BY ALLOWFROM) - 1 AS ALLOWTO
    FROM PRODUCTINFO
    ORDER BY PRODUCTID, ALLOWFROM;

桌子

我哪里错了?如何达到结果?

标签: sqloraclewindow-functions

解决方案


这是你需要的吗?我按产品 ID 订购(这不在您的问题中,但似乎很明显)。建议您阅读有关 LEAD/LAG 的文档以熟悉这些论点。

SELECT productid,
       allowfrom,
       LEAD(allowfrom - 1,1, TO_DATE('01.01.1900', 'MM.DD.YYYY')) 
         OVER(PARTITION BY productid ORDER BY allowfrom ASC) AS allowto
  FROM productinfo;

 PRODUCTID ALLOWFROM  ALLOWTO   
---------- ---------- ----------
         1 05.01.2018 06.04.2018
         1 06.05.2018 06.09.2018
         1 06.10.2018 06.19.2018
         1 06.20.2018 01.01.1900
         2 05.01.2018 06.17.2018
         2 06.18.2018 01.01.1900
         3 05.01.2018 06.07.2018
         3 06.08.2018 01.01.1900

推荐阅读