Запрос SQL для получения значения, которое встречается более одного раза

Мне нужно запросить мою базу данных, чтобы показать записи внутри моей таблицы, где lastname встречается более трех раз. Пример: в моей таблице студентов есть 3 человека с фамилией "Смит", 4 с "Джонсоном" и 1 с "Поттером". Мой запрос должен показывать записи тех, у кого есть последние имена Смит и Джонсон, поскольку эти значения имеют больше или равно 3 раза.

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

Ответы

Ответ 1

Для SQL Server 2005 +

;WITH T AS
(
SELECT *, 
       COUNT(*) OVER (PARTITION BY Lastname) as Cnt
FROM Students
)
SELECT * /*TODO: Add column list. Don't use "*"                   */
FROM T
WHERE Cnt >= 3

Ответ 2

Из Oracle (но работает в большинстве SQL-DB):

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

P.S. он быстрее, потому что у вас нет выбора с помощью выбора методов здесь

Ответ 3

Для MySQL:

SELECT lastname AS ln 
    FROM 
    (SELECT lastname, count(*) as Counter 
     FROM `students` 
     GROUP BY `lastname`) AS tbl WHERE Counter > 2

Ответ 4

SELECT LASTNAME, COUNT(*)
FROM STUDENTS
GROUP BY LASTNAME
ORDER BY COUNT(*) DESC

Ответ 5

Ответы, упомянутые здесь, довольно элегантны fooobar.com/questions/285321/..., но после тестирования я понимаю, что он возвращает только фамилию. Что делать, если вы хотите вернуть всю запись? Сделай это (Для Mysql)

SELECT *
FROM `beneficiary`
WHERE `lastname`
IN (

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

Ответ 6

Для postgresql:

SELECT * AS rec 
FROM (
    SELECT lastname, COUNT(*) AS counter 
    FROM students 
    GROUP BY lastname) AS tbl 
WHERE counter > 1;