在以下情况下如何更新特定记录?

问题描述 投票:0回答:1

我有一个如下所示的表数据结构,

身份证 姓名 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

oracle oracle11g oracle10g
1个回答
0
投票

我假设你:

  • 只想在
    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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.