Это случай для внешнего многораздельного соединения , которое может "добавить" недостающий ключ (квартал) для каждого раздела (product_id)
Основной запрос, которыйсписок недостающих кварталов для каждого продукта выглядит следующим образом:
SELECT p.PRODUCT, q.QUARTER
FROM PRICINGS p
PARTITION BY (p.Product)
RIGHT OUTER JOIN QUARTER q
ON p.Quarter = q.Quarter
where p.QUARTER is NULL
order by 1,2 ;
PRODUCT QUARTE
---------- ------
1 2018Q2
1 2018Q3
1 2018Q4
1 2019Q2
1 2019Q4
2 2018Q1
2 2018Q2
2 2018Q3
2 2018Q4
2 2019Q3
2 2019Q4
Остальное просто, как LISTAGG
, используя порядок следования четвертей
with q as
(
SELECT p.PRODUCT, q.QUARTER
FROM PRICINGS p
PARTITION BY (p.Product)
RIGHT OUTER JOIN QUARTER q
ON p.Quarter = q.Quarter
where p.QUARTER is NULL)
select PRODUCT,
listagg(QUARTER,',') within group (order by QUARTER DESC) qlist
from q
group by PRODUCT
PRODUCT, QLIST
1 2019Q4,2019Q2,2018Q4,2018Q3,2018Q2
2 2019Q4,2019Q3,2018Q4,2018Q3,2018Q2,2018Q1
Обратите внимание, что из соображений производительности этот способ предпочтительнее использования перекрестное соединение , поскольку вы выполняете оба соединения за один шаг.