Ответ 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
Мне нужно запросить мою базу данных, чтобы показать записи внутри моей таблицы, где lastname встречается более трех раз. Пример: в моей таблице студентов есть 3 человека с фамилией "Смит", 4 с "Джонсоном" и 1 с "Поттером". Мой запрос должен показывать записи тех, у кого есть последние имена Смит и Джонсон, поскольку эти значения имеют больше или равно 3 раза.
Может ли кто-нибудь указать мне на это? Я думал использовать COUNT(), но я не могу представить, как его применять?
Для 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
Из Oracle (но работает в большинстве SQL-DB):
SELECT LASTNAME, COUNT(*)
FROM STUDENTS
GROUP BY LASTNAME
HAVING COUNT(*) >= 3
P.S. он быстрее, потому что у вас нет выбора с помощью выбора методов здесь
Для MySQL:
SELECT lastname AS ln
FROM
(SELECT lastname, count(*) as Counter
FROM `students`
GROUP BY `lastname`) AS tbl WHERE Counter > 2
SELECT LASTNAME, COUNT(*)
FROM STUDENTS
GROUP BY LASTNAME
ORDER BY COUNT(*) DESC
Ответы, упомянутые здесь, довольно элегантны fooobar.com/questions/285321/..., но после тестирования я понимаю, что он возвращает только фамилию. Что делать, если вы хотите вернуть всю запись? Сделай это (Для Mysql)
SELECT *
FROM `beneficiary`
WHERE `lastname`
IN (
SELECT `lastname`
FROM `beneficiary`
GROUP BY `lastname`
HAVING COUNT( `lastname` ) >1
)
Для postgresql:
SELECT * AS rec
FROM (
SELECT lastname, COUNT(*) AS counter
FROM students
GROUP BY lastname) AS tbl
WHERE counter > 1;