Как выбрать записи с дублирующими полями из выборки записи по определенному условию в Postgresql

Рейтинг: 1Ответов: 1Опубликовано: 26.02.2023

Существует таблица с миллиноами записей.

например, такая выборка

select c.id, c.mobile_phone, c.last_name, c.email
from user c
group by c.id, c.mobile_phone, c.last_name, c.email
HAVING count(*) > 1;

занимает минуты.

Необходимо выбрасть записи с одинаковым mobile_phone, а из получившейся выборки выбрать записи - у которых одинаковый Email.

пробовал так

вот так получаю одинаковые записи по указанному номеру тел.

select * from (select * from user where mobile_phone = '78987787878') ou
where (select count(*) from user inr
       where inr.email = ou.email) > 1;

и так

SELECT
    *,
    ROW_NUMBER() OVER (
        PARTITION BY email, mobile_phone
        ORDER BY email, mobile_phone) AS Row_Number
FROM (select * from user where mobile_phone = '000023323232') as "c*";

но он не показывает дубликаты с email

У 5 пользователей - один и тот же номер телефона. Из этих 5 пользователей - 2 имееют одинаковый Email - они то и должны попасть в выборку.

select * from (select * from employee where
                                          mobile_phone = '23434302722') ou
where (select count(*) from employee inr
       where inr.email = ou.email) > 1;

Это работает не на всех версиях postgresql.

PostgreSQL 14.7 - работает.

PostgreSQL 13.7 - не работает.

Есть ли идеи как это сделать ?

Ответы

▲ 2

Получить список (mobile_phone, email), встречающихся более одного раза.

select mobile_phone, email
from user c
group by 1, 2
HAVING count(*) > 1;

Получить отдельные записи-дубликаты.

SELECT t1.*
FROM user t1
JOIN ( select mobile_phone, email
       from user c
       group by 1, 2
       HAVING count(*) > 1
       ) t2 USING (mobile_phone, email)