По сути, вы хотите подсчитать количество различных значений id2
в данных и количество различных значений id2
для каждого num
. Если только Postgres поддерживается count(distinct)
в качестве оконной функции, вы можете сделать:
select id2, num
from (select t.*,
count(distinct t.id2) over (partition by t.num) as cnt_id2_on_num,
count(distinct t.id2) over () as cnt_id2
from t
) t
where cnt_id2_on_num = cnt_id2;
Существует простой обходной путь, который представляет собой сумму dense_rank()
s:
select id2, num
from (select t.*,
(dense_rank() over (partition by t.num order by t.id2) +
dense_rank() over (partition by t.num order by t.id2 desc)
) as cnt_id2_on_num,
(dense_rank() over (order by t.id2) +
dense_rank() over (order by t.id2 desc)
) as cnt_id2
from mytable t
) d
where cnt_id2_on_num = cnt_id2;
Если вы знаете, что дубликатов нет, вы можете написать это как:
select id2, num
from (select t.*,
count(*) (partition by t.num) as cnt_id2_on_num,
(dense_rank() over (order by t.id2) +
dense_rank() over (order by t.id2 desc)
) as cnt_id2
from mytable t
) d
where cnt_id2_on_num = cnt_id2;