#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));