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

xpszyzbs  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(104)

我有一个像下面这样的表数据结构,
| ID|名称|开始日期|结束日期|创建日期|
| --|--|--|--|--|
| 100 |苹果|2023年11月1日|一九九九年十二月三十一日|2023年11月1日|
| 100 |Anar| 2023年10月10日|一九九九年十二月三十一日|23年9月12日|
| 100 |Anar| 2023年9月4日|2023年10月10日|2023年9月4日|
| 101 |蚂蚁|2023年10月1日|一九九九年十二月三十一日|2023年10月1日|
| 101 |蜜蜂|23年4月10日|一九九九年十二月三十一日|23年4月12日|
| 101 |蜜蜂|23年3月4日|23年4月10日|23年3月4日|
我想像下面这样更新数据,(第二行start_date应该像CREATE_DATE一样更新,END_DATE应该从下一个start_date开始更新)
| ID|名称|开始日期|结束日期|创建日期|
| --|--|--|--|--|
| 100 |苹果|2023年11月1日|一九九九年十二月三十一日|2023年11月1日|
|**100人|Anar| 2023年9月12日|2023年11月1日|2023年9月12日 *|
| 100 |Anar| 2023年9月4日|2023年10月10日|2023年9月4日|
| 101 |蚂蚁|2023年10月1日|一九九九年十二月三十一日|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

nwwlzxa7

nwwlzxa71#

我假设你:

  • 仅当end_date9999-12-31时才修改行;
  • 想要将create_date显示为start_date;以及
  • 如果end_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;


产出:
| ID|名称|开始日期|结束日期|创建日期|
| --|--|--|--|--|
| 100 |Anar| 2023-09-04 00:00:00| 2023-10-10 00:00:00| 2023-09-04 00:00:00|
| 100 |Anar| 2023-09-12 00:00:00| 2023年11月1日00:00:00| 2023-09-12 00:00:00|
| 100 |苹果|2023年11月1日00:00:00| 2019 - 09 -12 00:00:00| 2023年11月1日00:00:00|
| 101 |蜜蜂|2023-03-04 00:00:00| 2023-04-10 00:00:00| 2023-03-04 00:00:00|
| 101 |蜜蜂|2019 -04-12 00:00:00| 2023-10-01 00:00:00| 2019 -04-12 00:00:00|
| 101 |蚂蚁|2023-10-01 00:00:00| 2019 - 09 -12 00:00:00| 2023-10-01 00:00:00|
fiddle

相关问题