Bạn có thể tính số "chu kỳ" bằng truy vấn đệ quy, như sau.
Như đã trình bày trong phần nhận xét dưới câu hỏi của bạn, tôi không hiểu bạn muốn nói gì về cột "tuần" (và tôi nghi ngờ rằng có thể định nghĩa của bạn thực sự không nhất quán - để bạn làm rõ).
with
r (plan, period, max_periods, start_date) as (
select plan, 1, max_periods, start_date
from table_1
union all
select plan, period + 1, max_periods,
least(start_date + 7, add_months(trunc(start_date, 'mm'), 1))
from r
where period < max_periods
)
select plan, period, start_date
from r
;
PLAN PERIOD START_DATE
---- ---------- ----------
A 1 2020-05-01
A 2 2020-05-08
A 3 2020-05-15
A 4 2020-05-22
A 5 2020-05-29
A 6 2020-06-01
A 7 2020-06-08
A 8 2020-06-15
A 9 2020-06-22
A 10 2020-06-29
A 11 2020-07-01
A 12 2020-07-08
Điều này dựa trên khoảng thời gian tối đa từ TABLE_1 và tôi hoàn toàn không sử dụng TABLE_2. Bạn có thể kết hợp hai bảng sau khi tạo tập kết quả này chỉ từ TABLE_1 hoặc điều chỉnh cách tiếp cận nếu cần.