如何根据上一行插入新行
How to insert a new row based on previous row
给定 table:
Name
Date
Last Date
Frequency
Person1
1-Jan-2022
2-May-2022
30 Days
预期输出:
Name
Updated Date
Some Other Column
Person1
1-Jan-2022
Value 1
Person1
31-Jan-2022
Value 2
Person1
2-Mar-2022
Value 3
Person1
1-Apr-2022
Value 4
Person1
1-May-2022
Value 5
如上所示,我们得到了一条记录,要求的是从这条记录中创建一条新的table。我们必须继续插入新行,直到预期 table 中的“更新日期”(上一行日期 + 频率天数)小于给定 table 中的“最后日期”。
我想了解 Oracle SQL 是否有办法实现这一点。 (没有 PL/SQL)。
我们可以在 INSERT SELECT 中使用递归 CTE 来生成日期。
我使用了 where name = 'Person1'
但这可以根据需要删除或修改。如果表 1 中的记录存在于表 2 中,应该更新、复制还是不做任何更改?
我冒昧地将天数的频率字段类型设置为 int
。我们可以将其更改为能够以天、周、月等为单位对频率进行编程,但 CTE 的增量会变得更加复杂。
底部有个dbFiddle link.
create Table table1(
Name varchar(25),
FirstDate Date,
LastDate Date,
Frequency int);
insert into table1 values
('Person1','1-Jan-2022','2-May-2022',30);
create table table2 (
Name varchar(25),
UpdatedDate date,
SomeColumn varchar(25));
INSERT INTO table2
WITH CTE (Name, Date_, LD ) AS
(SELECT
Name,
FirstDate AS Date_ ,
LastDate
FROM table1
WHERE Name = 'Person1'
UNION ALL
SELECT
Name,
Date_ + 30,
LD
FROM CTE
WHERE Date_ <= LD)
SELECT Name, Date_, null FROM CTE;
SELECT * FROM table2;
NAME | UPDATEDDATE | SOMECOLUMN
:------ | :---------- | :---------
Person1 | 01-JAN-22 | null
Person1 | 31-JAN-22 | null
Person1 | 02-MAR-22 | null
Person1 | 01-APR-22 | null
Person1 | 01-MAY-22 | null
Person1 | 31-MAY-22 | null
db<>fiddle here
给定 table:
Name | Date | Last Date | Frequency |
---|---|---|---|
Person1 | 1-Jan-2022 | 2-May-2022 | 30 Days |
预期输出:
Name | Updated Date | Some Other Column |
---|---|---|
Person1 | 1-Jan-2022 | Value 1 |
Person1 | 31-Jan-2022 | Value 2 |
Person1 | 2-Mar-2022 | Value 3 |
Person1 | 1-Apr-2022 | Value 4 |
Person1 | 1-May-2022 | Value 5 |
如上所示,我们得到了一条记录,要求的是从这条记录中创建一条新的table。我们必须继续插入新行,直到预期 table 中的“更新日期”(上一行日期 + 频率天数)小于给定 table 中的“最后日期”。
我想了解 Oracle SQL 是否有办法实现这一点。 (没有 PL/SQL)。
我们可以在 INSERT SELECT 中使用递归 CTE 来生成日期。
我使用了 where name = 'Person1'
但这可以根据需要删除或修改。如果表 1 中的记录存在于表 2 中,应该更新、复制还是不做任何更改?
我冒昧地将天数的频率字段类型设置为 int
。我们可以将其更改为能够以天、周、月等为单位对频率进行编程,但 CTE 的增量会变得更加复杂。
底部有个dbFiddle link.
create Table table1( Name varchar(25), FirstDate Date, LastDate Date, Frequency int);
insert into table1 values ('Person1','1-Jan-2022','2-May-2022',30);
create table table2 ( Name varchar(25), UpdatedDate date, SomeColumn varchar(25));
INSERT INTO table2 WITH CTE (Name, Date_, LD ) AS (SELECT Name, FirstDate AS Date_ , LastDate FROM table1 WHERE Name = 'Person1' UNION ALL SELECT Name, Date_ + 30, LD FROM CTE WHERE Date_ <= LD) SELECT Name, Date_, null FROM CTE;
SELECT * FROM table2;
NAME | UPDATEDDATE | SOMECOLUMN :------ | :---------- | :--------- Person1 | 01-JAN-22 | null Person1 | 31-JAN-22 | null Person1 | 02-MAR-22 | null Person1 | 01-APR-22 | null Person1 | 01-MAY-22 | null Person1 | 31-MAY-22 | null
db<>fiddle here