我需要查询我的数据库,以显示我的表中的lastname发生三次以上的记录。示例:在我的学生表中,有3个人使用姓氏'史密斯',4个人使用'约翰逊',1个人使用'波特'。我的查询应显示姓氏史密斯和约翰逊的记录,因为这些值大于或等于3次。
有人能指出这个吗?我在考虑使用COUNT(),但我似乎无法想到如何应用它?
答案 0 :(得分:31)
对于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
答案 1 :(得分:21)
来自Oracle(但在大多数SQL数据库中工作):
SELECT LASTNAME, COUNT(*)
FROM STUDENTS
GROUP BY LASTNAME
HAVING COUNT(*) >= 3
P.S。它的更快之一,因为你没有在这里选择选择方法
答案 2 :(得分:12)
对于MySQL:
SELECT lastname AS ln
FROM
(SELECT lastname, count(*) as Counter
FROM `students`
GROUP BY `lastname`) AS tbl WHERE Counter > 2
答案 3 :(得分:5)
这里提到的答案非常优雅https://stackoverflow.com/a/6095776/1869562但经过测试,我发现它只返回姓氏。 如果您想要返回整个记录本怎么办? 做这个 (对于Mysql)
SELECT *
FROM `beneficiary`
WHERE `lastname`
IN (
SELECT `lastname`
FROM `beneficiary`
GROUP BY `lastname`
HAVING COUNT( `lastname` ) >1
)
答案 4 :(得分:4)
SELECT LASTNAME, COUNT(*)
FROM STUDENTS
GROUP BY LASTNAME
ORDER BY COUNT(*) DESC
答案 5 :(得分:1)
对于postgresql:
SELECT * AS rec
FROM (
SELECT lastname, COUNT(*) AS counter
FROM students
GROUP BY lastname) AS tbl
WHERE counter > 1;
答案 6 :(得分:0)
我认为这个答案也可以(虽然可能需要一些修改):
SELECT * FROM Students AS S1 WHERE EXISTS(SELECT Lastname, count(*) FROM Students AS S2 GROUP BY Lastname HAVING COUNT(*) > 3 WHERE S2.Lastname = S1.Lastname)