SQL запрос для получения значений, встречающихся более одного раза
Я пытаюсь сформировать запрос к своей базе данных, чтобы отобразить записи в таблице, где фамилия встречается более трех раз. Например, в моей таблице студентов есть 3 человека с фамилией 'Smith', 4 с 'Johnson' и 1 с 'Potter'. Мой запрос должен показывать записи только тех, чьи фамилии 'Smith' и 'Johnson', так как эти значения встречаются 3 раза и более.
Может ли кто-нибудь помочь мне с этим? Я думал использовать COUNT(), но не могу понять, как именно его применить.
5 ответ(ов)
Ваш запрос в целом справен, но он может быть упрощён. Вот более лаконичная версия, использующая HAVING в сочетании с GROUP BY для фильтрации по количеству:
SELECT lastname AS ln
FROM students
GROUP BY lastname
HAVING COUNT(*) > 2;
В этом запросе мы группируем записи по фамилии (lastname
) и используем оператор HAVING
для фильтрации тех фамилий, у которых количество записей превышает 2. Это сделает ваш запрос более оптимальным и читаемым.
Этот SQL-запрос написан для Oracle, но работает практически в большинстве SQL баз данных:
SELECT LASTNAME, COUNT(*)
FROM STUDENTS
GROUP BY LASTNAME
HAVING COUNT(*) >= 3
Данный запрос позволяет выбрать фамилии студентов и подсчитать количество записей для каждой фамилии, при этом он отбирает только те фамилии, у которых количество записей больше или равно 3.
Важно отметить, что такой подход является более эффективным, поскольку в нем отсутствует использование вложенных SELECT-запросов. Это может значительно ускорить выполнение запроса, особенно на больших объемах данных. Если у вас есть дополнительные вопросы по оптимизации запросов или их построению, не стесняйтесь задавать!
Если вы хотите выбрать студентов из таблицы Students
, у которых фамилия встречается 3 или более раз, вы можете использовать следующий запрос в SQL Server 2005 и выше:
;WITH T AS
(
SELECT *,
COUNT(*) OVER (PARTITION BY Lastname) as Cnt
FROM Students
)
SELECT /* Укажите явным образом нужные столбцы вместо '*' */
StudentID, Lastname, Firstname, ... /* другие столбцы по необходимости */
FROM T
WHERE Cnt >= 3
В этом запросе сначала создается временная таблица T
, в которой считается количество студентов с одинаковой фамилией с помощью функции COUNT()
и предложения OVER (PARTITION BY Lastname)
. После этого из временной таблицы выбираются только те записи, где количество студентов с такой фамилией (Cnt) равно или больше 3.
Не забудьте заменить /* другие столбцы по необходимости */
на конкретные названия столбцов, которые вы хотите получить в результате, чтобы избежать использования SELECT *
, что является хорошей практикой.
Если вам нужно вернуть не только фамилию, но и всю запись из таблицы beneficiary
, вы можете использовать следующий SQL-запрос. Он выбирает все столбцы из таблицы, где фамилия встречается более одного раза:
SELECT *
FROM `beneficiary`
WHERE `lastname` IN (
SELECT `lastname`
FROM `beneficiary`
GROUP BY `lastname`
HAVING COUNT(`lastname`) > 1
)
Этот запрос сначала извлекает все фамилии, которые встречаются более одного раза, а затем использует их для фильтрации полных записей из таблицы beneficiary
. Таким образом, вы получите полностью все записи с фамилиями, встречающимися более одного раза.
Этот SQL-запрос выбирает фамилии студентов из таблицы STUDENTS
и подсчитывает, сколько раз каждая фамилия встречается в этой таблице.
Вот разбор запроса:
SELECT LASTNAME, COUNT(*)
: здесь мы выбираем столбецLASTNAME
и используем функцию агрегированияCOUNT(*)
, чтобы подсчитать количество записей для каждой фамилии.FROM STUDENTS
: указываем, что данные берутся из таблицыSTUDENTS
.GROUP BY LASTNAME
: мы группируем результаты по полюLASTNAME
, чтобы считать количество записей для каждой фамилии отдельно.ORDER BY COUNT(*) DESC
: сортируем результаты по количеству (значению, возвращаемому функциейCOUNT(*)
) в порядке убывания, чтобы фамилии с наибольшим количеством записей оказались первыми в результате.
Таким образом, этот запрос возвращает список фамилий студентов с указанием числа студентов с каждой фамилией, отсортированный от самой распространенной фамилии к самой редкой.
Попытка получить среднее значение из результирующего набора с подсчетом
Как посчитать количество вхождений символа в значении varchar Oracle?
Возможно ли задать условия в Count()?
Выполнение SQL из файла в SQLAlchemy
Параметризованные запросы с условиями LIKE и IN