Как вывести список строк с повторяющимися столбцами

#postgresql

Вопрос:

У меня есть таблица с полями id, name, birthday, clinic :

 id | name | birthday | clinic  1 | mary | 2020-01-01 | clin 1  2 | mary | 2020-01-01 | clin 1  3 | mary | 2020-01-01 | clin 2  4 | john | 2021-01-01 | clin 1  5 | pete | 2020-01-05 | clin 1  6 | pete | 2020-01-05 | clin 2  7 | pete | 2020-01-05 | clin 3  

Я хочу получить все записи с name, birthday дубликатом, как:

 id | name | birthday | clinic  1 | mary | 2020-01-01 | clin 1  2 | mary | 2020-01-01 | clin 1  3 | mary | 2020-01-01 | clin 2  5 | pete | 2020-01-05 | clin 1  6 | pete | 2020-01-05 | clin 2  7 | pete | 2020-01-05 | clin 3  

У Мэри и Пита есть более одной записи с одинаковым именем и днем рождения

Ответ №1:

Используя COUNT() в качестве аналитической функции, мы можем попробовать:

 WITH cte AS (  SELECT *, COUNT(*) OVER (PARTITION BY name, birthday) cnt  FROM yourTable )  SELECT id, name, birthday, clinic FROM cte WHERE cnt gt; 1;  

Ответ №2:

пробовать

 select * from lt;tablegt; where (name , birthday) in (  select name , birthday from lt;tablegt; group by name, birthday having count(*)gt;1)  

Ответ №3:

Вы можете использовать условие EXISTS:

 select t1.* from the_table t1 where exists (select *  from the_table t2  where t1.id lt;gt; t2.id  and (t1.name, t1.birthday) = (t2.name, t2.birthday));