请帮助在 Oracle SQL 中实现此目的。
我的表结构如下,
create table temp_t
(
rule_id number,
start_datetime timestamp,
end_datetime timestamp,
last_update timestamp
);
insert into temp_t values (2345,TO_TIMESTAMP('2023-10-02 15:22:37','YYYY-MM-DD HH24:MI:SS'),null,null);
insert into temp_t values (2345,TO_TIMESTAMP('2023-10-02 15:18:36','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2023-10-02 15:22:36','YYYY-MM-DD HH24:MI:SS'),null);
insert into temp_t values (2345,TO_TIMESTAMP('2023-10-02 15:15:18','YYYY-MM-DD HH24:MI:SS'),null,null);
insert into temp_t values (2345,TO_TIMESTAMP('2023-10-02 15:11:02','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2023-10-02 15:12:10','YYYY-MM-DD HH24:MI:SS'),null);
insert into temp_t values (2345,TO_TIMESTAMP('2023-10-02 14:03:02','YYYY-MM-DD HH24:MI:SS'),null,null);
表格数据:
预期结果如下所示, END_DATETIME 上的 NULL 值将根据上一行的 START_DATETIME 列进行更新,误差为负 1 秒。 END_DATETIME NULL 的最新行不应更新。
RULE_ID | START_DATETIME | END_DATETIME |
-----------------------------------------------------------------------
2345 |02-OCT-23 03.22.37.000000000 PM | NULL
2345 |02-OCT-23 03.18.36.000000000 PM | 02-OCT-23 03.22.36.000000000 PM
2345 |02-OCT-23 03.15.18.000000000 PM | 02-OCT-23 03.18.35.000000000 PM
2345 |02-OCT-23 03.11.02.000000000 PM | 02-OCT-23 03.12.10.000000000 PM
2345 |02-OCT-23 02.03.02.000000000 PM | 02-OCT-23 03.11.01.000000000 PM
将结束时间重新定义为下一行的开始时间,以获得无缝序列:
SELECT rule_id,
start_datetime,
LEAD(start_datetime) OVER (PARTITION BY rule_id ORDER BY start_datetime) AS end_datetime
FROM temp_t
或者,如果您希望现有的
end_datetime
值正确,即使下一个开始时间是在未来,您也可以保留现有的值,并且仅在它们为 NULL 时替换它们:
SELECT rule_id,
start_datetime,
NVL(end_datetime,LEAD(start_datetime) OVER (PARTITION BY rule_id ORDER BY start_datetime)) AS end_datetime
FROM temp_t