0

SQL запрос для получения значений, встречающихся более одного раза

10

Я пытаюсь сформировать запрос к своей базе данных, чтобы отобразить записи в таблице, где фамилия встречается более трех раз. Например, в моей таблице студентов есть 3 человека с фамилией 'Smith', 4 с 'Johnson' и 1 с 'Potter'. Мой запрос должен показывать записи только тех, чьи фамилии 'Smith' и 'Johnson', так как эти значения встречаются 3 раза и более.

Может ли кто-нибудь помочь мне с этим? Я думал использовать COUNT(), но не могу понять, как именно его применить.

5 ответ(ов)

0

Ваш запрос в целом справен, но он может быть упрощён. Вот более лаконичная версия, использующая HAVING в сочетании с GROUP BY для фильтрации по количеству:

SELECT lastname AS ln
FROM students
GROUP BY lastname
HAVING COUNT(*) > 2;

В этом запросе мы группируем записи по фамилии (lastname) и используем оператор HAVING для фильтрации тех фамилий, у которых количество записей превышает 2. Это сделает ваш запрос более оптимальным и читаемым.

0

Этот SQL-запрос написан для Oracle, но работает практически в большинстве SQL баз данных:

SELECT LASTNAME, COUNT(*)
FROM STUDENTS
GROUP BY LASTNAME
HAVING COUNT(*) >= 3

Данный запрос позволяет выбрать фамилии студентов и подсчитать количество записей для каждой фамилии, при этом он отбирает только те фамилии, у которых количество записей больше или равно 3.

Важно отметить, что такой подход является более эффективным, поскольку в нем отсутствует использование вложенных SELECT-запросов. Это может значительно ускорить выполнение запроса, особенно на больших объемах данных. Если у вас есть дополнительные вопросы по оптимизации запросов или их построению, не стесняйтесь задавать!

0

Если вы хотите выбрать студентов из таблицы 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 *, что является хорошей практикой.

0

Если вам нужно вернуть не только фамилию, но и всю запись из таблицы beneficiary, вы можете использовать следующий SQL-запрос. Он выбирает все столбцы из таблицы, где фамилия встречается более одного раза:

SELECT *
FROM `beneficiary`
WHERE `lastname` IN (
  SELECT `lastname`
  FROM `beneficiary`
  GROUP BY `lastname`
  HAVING COUNT(`lastname`) > 1
)

Этот запрос сначала извлекает все фамилии, которые встречаются более одного раза, а затем использует их для фильтрации полных записей из таблицы beneficiary. Таким образом, вы получите полностью все записи с фамилиями, встречающимися более одного раза.

0

Этот SQL-запрос выбирает фамилии студентов из таблицы STUDENTS и подсчитывает, сколько раз каждая фамилия встречается в этой таблице.

Вот разбор запроса:

  1. SELECT LASTNAME, COUNT(*): здесь мы выбираем столбец LASTNAME и используем функцию агрегирования COUNT(*), чтобы подсчитать количество записей для каждой фамилии.

  2. FROM STUDENTS: указываем, что данные берутся из таблицы STUDENTS.

  3. GROUP BY LASTNAME: мы группируем результаты по полю LASTNAME, чтобы считать количество записей для каждой фамилии отдельно.

  4. ORDER BY COUNT(*) DESC: сортируем результаты по количеству (значению, возвращаемому функцией COUNT(*)) в порядке убывания, чтобы фамилии с наибольшим количеством записей оказались первыми в результате.

Таким образом, этот запрос возвращает список фамилий студентов с указанием числа студентов с каждой фамилией, отсортированный от самой распространенной фамилии к самой редкой.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь