请帮助在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
1条答案
按热度按时间qybjjes11#
将结束时间重新定义为下一行的开始时间,以获得无间隙序列:
或者,如果您希望现有的
end_datetime
值是正确的,即使下一个开始时间是在未来,您可以保留现有的值,仅在它们为NULL时替换它们:如果你想更新表而不是用
SELECT
拉取,那么你甚至不需要窗口函数: