我有一个关系Presidents(firstName,lastName,beginTerm,endTerm) 提供有关美国总统的信息。属性firstName是一个字符串 使用名字,在某些情况下,还有一个或多个 中间名首字母。
属性lastName是一个包含总统姓氏的字符串。例如, 前任总统有firstName ='George W.'他的父亲有firstName ='George H.W.';两者都有lastName ='Bush'。最后两个属性,beginTerm和endTerm, 是总统分别进入和离职的年份。
一个微妙之处在于格罗弗克利夫兰为2个不连续服务 条款。他出现在2个元组中,一个是第一个学期的开始和结束年份,另一个是第二个学期。
我的问题如下:
有两对父亲和儿子的总统。但是这里有 其他一些共同姓氏的总统。查找属于2位或更多位总统的所有姓氏。不要重复使用姓氏,并记住,服务于2个不同条款的同一个人(例如,格罗弗·克利夫兰)不构成具有相同姓氏的2位总统的案例。
我首先想到答案可能是:
SELECT lastName
FROM Presidents
WHERE COUNT(lastName) > 2
EXCEPT lastName = 'Cleveland';
我不太确定是否可以在WHERE子句中使用COUNT()函数。 这可能吗?
谢谢!
答案 0 :(得分:7)
在检查组功能时使用HAVING而不是WHERE。
SELECT lastName
FROM Presidents
WHERE lastName != 'Cleveland'
GROUP BY lastName
HAVING COUNT(lastName) > 2;
然而,当解决SQL-puzzles喜欢这个时,你永远不应该考虑实际的数据。它应该适用于所有一致的数据集!我相信这是解决问题的实际方法:
SELECT DISTINCT p1.lastName
FROM Presidents p1, Presidents p2
WHERE p1.lastName == p2.LastName
AND p1.firstName != p2.firstName;
答案 1 :(得分:2)
您使用HAVING
约束聚合,并且您也错过了一个组。
SELECT lastName
FROM Presidents
where lastName <> 'Cleveland';
group by lastname
having COUNT(lastName) > 2
答案 2 :(得分:0)
假设还有一个id字段,
select id, lastname, count(*) differentguycount
from presidents left join
(select id, firstname, lastname count(*) sameguycount
from presidents
group by id, firstname, lastname
having sameguycount > 1 ) temp on temp.id = presidents.id
where temp.firstname is null
group by id, lastname
having differentguycount > 1
如上所述,OP没有指定可能导致语法错误的数据库引擎。例如,某些数据库可能不允许您在having子句中使用别名。