【发布时间】:2020-06-05 07:43:15
【问题描述】:
我的表 PRODUCTINFO 有 2 列:PRODUCTID (NUMBER)、ALLOWFROM (DATE),现在我需要再插入一列 ALLOWTO (DATE),它等于下一行中的 ALLOWFROM 减去 1 天。如果PRODUCTID 没有下一个ALLOWFROM,则应打印'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;
我哪里错了?如何达到结果?
【问题讨论】:
-
这是 oracle 还是 mysql ?这是两种不同的数据库技术。请调整您的标签。
-
LEAD/LAG 是分析函数,允许您访问查询的上一行/下一行。根据您的解释,您不需要上一行,而只需要上一个日期值。尝试 NVL(ALLOWTO,TO_DATE('02-JAN-1900','DD-MON-YYYY') - 1 代替。
-
我已经删除了所有冲突的标签。 MySQL 和 Oracle 是完全不同的 RDBMS,都不使用 T-SQL(由 SQL Server 使用)。请仅重新标记您实际使用的内容。
-
嗨@KoenLostrie!正如我所解释的,我需要新列(表中的第三列)ALLOW_TO,它等于下一个 ALLOWFROM(第二列)减去一天。这就是我使用 LEAD 访问下一个 ALLOWFROM 行的原因。
-
@hatorihanso。请提供适当的可重现示例:创建表脚本,插入示例行。这使我们更容易理解实际问题。图片看起来很棒,但我无法将它们复制到 sqldeveloper 中运行...stackoverflow.com/help/minimal-reproducible-example
标签: sql oracle window-functions