我有一个如下所示的表数据结构,
身份证 | 姓名 | START_DATE | END_DATE | 创建_日期 |
---|---|---|---|---|
100 | 苹果 | 23 年 11 月 1 日 | 99 年 12 月 31 日 | 23 年 11 月 1 日 |
100 | 阿纳尔 | 23 年 10 月 10 日 | 99 年 12 月 31 日 | 23 年 9 月 12 日 |
100 | 阿纳尔 | 23 年 9 月 4 日 | 23 年 10 月 10 日 | 23 年 9 月 4 日 |
101 | 蚂蚁 | 23 年 10 月 1 日 | 99 年 12 月 31 日 | 23 年 10 月 1 日 |
101 | 蜜蜂 | 23 年 4 月 10 日 | 99 年 12 月 31 日 | 23 年 4 月 12 日 |
101 | 蜜蜂 | 23 年 3 月 4 日 | 23 年 4 月 10 日 | 23 年 3 月 4 日 |
我想更新如下数据,(第二行 start_date 应像 CREATE_DATE 一样更新,END_DATE 应从下一个 start_date 开始更新)
身份证 | 姓名 | START_DATE | END_DATE | 创建_日期 |
---|---|---|---|---|
100 | 苹果 | 2023 年 11 月 1 日 | 99 年 12 月 31 日 | 2023 年 11 月 1 日 |
**100 | 阿纳尔 | 2023 年 9 月 12 日 | 2023 年 11 月 1 日 | 2023 年 9 月 12 日** |
100 | 阿纳尔 | 2023 年 9 月 4 日 | 23 年 10 月 10 日 | 2023 年 9 月 4 日 |
101 | 蚂蚁 | 2023 年 10 月 1 日 | 99 年 12 月 31 日 | 2023 年 10 月 1 日 |
**101 | 蜜蜂 | 2023 年 4 月 12 日 | 2023 年 10 月 1 日 | 2023 年 4 月 12 日** |
101 | 蜜蜂 | 2023 年 3 月 4 日 | 23 年 4 月 10 日 | 23 年 4 月 10 日 |
注意 - 她是针对一个用户的一个 id 的,其 end_date 应该为 31-DEC-99
我假设你:
end_date
为 9999-12-31
时修改行;create_date
显示为 start_date
;和create_date
作为 end_date
(如果存在),否则使用当前的 end_date
。鉴于该假设,您可以使用
CASE
表达式和 LEAD
分析函数:
SELECT id,
name,
CASE
WHEN end_date = DATE '9999-12-31'
THEN create_date
ELSE start_date
END AS start_date,
CASE
WHEN end_date = DATE '9999-12-31'
THEN LEAD(create_date, 1, end_date) OVER (PARTITION BY id ORDER BY create_date)
ELSE end_date
END AS end_date,
create_date
FROM table_name
ORDER BY id, create_date
对于样本数据:
CREATE TABLE table_name (ID, NAME, START_DATE, END_DATE, CREATE_DATE) AS
SELECT 100, 'Apple', DATE '2023-11-01', DATE '9999-12-31', DATE '2023-11-01' FROM DUAL UNION ALL
SELECT 100, 'Anar', DATE '2023-10-10', DATE '9999-12-31', DATE '2023-09-12' FROM DUAL UNION ALL
SELECT 100, 'Anar', DATE '2023-09-04', DATE '2023-10-10', DATE '2023-09-04' FROM DUAL UNION ALL
SELECT 101, 'Ant', DATE '2023-10-01', DATE '9999-12-31', DATE '2023-10-01' FROM DUAL UNION ALL
SELECT 101, 'Bee', DATE '2023-04-10', DATE '9999-12-31', DATE '2023-04-12' FROM DUAL UNION ALL
SELECT 101, 'Bee', DATE '2023-03-04', DATE '2023-04-10', DATE '2023-03-04' FROM DUAL;
输出:
身份证 | 姓名 | START_DATE | END_DATE | 创建_日期 |
---|---|---|---|---|
100 | 阿纳尔 | 2023-09-04 00:00:00 | 2023-10-10 00:00:00 | 2023-09-04 00:00:00 |
100 | 阿纳尔 | 2023-09-12 00:00:00 | 2023-11-01 00:00:00 | 2023-09-12 00:00:00 |
100 | 苹果 | 2023-11-01 00:00:00 | 9999-12-31 00:00:00 | 2023-11-01 00:00:00 |
101 | 蜜蜂 | 2023-03-04 00:00:00 | 2023-04-10 00:00:00 | 2023-03-04 00:00:00 |
101 | 蜜蜂 | 2023-04-12 00:00:00 | 2023-10-01 00:00:00 | 2023-04-12 00:00:00 |
101 | 蚂蚁 | 2023-10-01 00:00:00 | 9999-12-31 00:00:00 | 2023-10-01 00:00:00 |