Аналитические функции - ваши друзья
with data as (
select
mem_no, join_date, end_date, product_id, Indicator,
count(*) over (partition by mem_no, join_date, end_date, product_id) as cnt,
listagg(Indicator, ',') WITHIN GROUP (ORDER BY Indicator)
over (partition by mem_no, join_date, end_date, product_id) Indicator_lst
from tab)
select mem_no, join_date, end_date, product_id, Indicator
from data
where cnt = 2 and
Indicator_lst in ('PR,SN','SN,SR');
CTO вычисляет количество строк с одинаковыми mem_no, join_date, end_date, product_id .listagg
объединяет показатели.Основной запрос фильтрует два желаемых условия.
На ваших данных образца вы получаете
MEM_NO JOIN_DATE END_DATE PRODUCT_ID INDICATOR
---------- ------------------- ------------------- ---------- ---------
2 02-11-2018 00:00:00 12-12-2018 00:00:00 1 PR
2 02-11-2018 00:00:00 12-12-2018 00:00:00 1 SN
3 03-05-2017 00:00:00 12-12-2018 00:00:00 8 SN
3 03-05-2017 00:00:00 12-12-2018 00:00:00 8 SR
4 03-05-2017 00:00:00 12-12-2018 00:00:00 87 SN
4 03-05-2017 00:00:00 12-12-2018 00:00:00 87 SR