SQL — запрос имен, которые встречаются как минимум дважды

#sql #postgresql

#sql #postgresql

Вопрос:

Итак, я пытаюсь найти способ запросить таблицу «люди» с атрибутом «имя», и я хотел бы запросить имена, которые встречаются как минимум дважды, при этом результаты должны быть разными.

Я думал о создании двух таблиц псевдонимов и объединении по имени, но я не могу понять это.

Вот что я попробовал:

 SELECT DISTINCT name
FROM people AS S1 
INNER JOIN people AS S2 USING name
WHERE S2.lastname <> S2.surname
 

Часть с фамилией, которую я сделал, чтобы удалить случаи появления имен из-за равенства двух таблиц (даже не уверен, правильно ли это).
Но в любом случае это уже не удалось, поскольку синтаксис неправильный.

Был бы признателен за помощь! Заранее спасибо.

Комментарии:

1. ... using (name) ...

Ответ №1:

Агрегирование — это простой метод, если вам нужны только имена:

 select name
from persons
group by name
having count(*) > 1;
 

Если вам нужны исходные строки, используйте оконные функции:

 select p.*
from (select p.*, count(*) over (partition by name) as cnt
      from persons p
     ) p
where cnt >= 2;
 

Ответ №2:

Просто: используйте EXISTS() [вам нужно выбрать из таблицы people только один раз, и вам не нужно использовать DISTINCT ] :


 SELECT *
FROM people s1 
WHERE EXISTS (SELECT *
    FROM people s2
    WHERE s2.name = s1.name
    AND S2.lastname <> S1.lastname
    );
 

КСТАТИ: предполагая, что lastname <—> фамилия была опечаткой?

Ответ №3:

 select p.people_name, count(1) as cnt
from people p
group by 1
having cnt >=1