我确信在SQL Oracle中有一种简单的方法可以做到这一点,但我找不到。
我有一个表(temp(,有3列(id_1,id_2,date(,其中date是date类型。每一行都是独一无二的。
我想要的输出是用一个新的日期列重复每行15次,其中一行是原始日期,第二行是原始+1天,第三行是原始+2天,等等,对于每个原始行。。。
用原始表定义一个具有15行和简单cross join
的辅助CTO
with days as (
select rownum -1 as day_offset
from dual connect by level <= 15)
select
a.id1, a.id2, a.date_d + b.day_offset new_date_d
from tab a
cross join days b
order by 1,2,3;
示例-对于示例数据。。。
select * from tab;
ID1 ID2 DATE_D
---------- ---------- -------------------
1 1 01.01.2020 00:00:00
2 2 01.01.2019 00:00:00
您将得到以下输出
ID1 ID2 NEW_DATE_D
---------- ---------- -------------------
1 1 01.01.2020 00:00:00
1 1 02.01.2020 00:00:00
1 1 03.01.2020 00:00:00
1 1 04.01.2020 00:00:00
1 1 05.01.2020 00:00:00
....
2 2 13.01.2019 00:00:00
2 2 14.01.2019 00:00:00
2 2 15.01.2019 00:00:00
30 rows selected.
您也可以使用递归子查询分解
*天偏移量是递归计算的,因为days.day_offset + 1
被限制为15,并用于构建新的日期值
with days( id1, id2, date_d, day_offset) as (
select id1, id2, date_d, 0 day_offset from tab
union all
select days.id1, days.id2, tab.date_d + days.day_offset + 1 as date_d,
days.day_offset + 1 as day_offset
from tab
join days
on tab.id1 = days.id1 and tab.id2 = days.id2
and days.day_offset +1 < 15)
select * from days
order by 1,2,3