1

米国大統領に関する情報を提供するリレーション Presidents(firstName,lastName,beginTerm,endTerm) があります。属性 firstName は、ファースト ネームと、場合によっては 1 つ以上のミドル ネームのイニシャルを含む文字列です。

属性 lastName は、大統領の姓の文字列です。たとえば、前の大統領は firstName = 'George W.' です。彼の父親は firstName = 'George HW'; です。どちらも lastName = 'Bush' です。最後の 2 つの属性 beginTerm と endTerm は、それぞれ大統領が就任した年と辞任した年です。

微妙な点の 1 つは、Grover Cleveland が連続していない 2 期を務めたことです。彼は 2 つのタプルで表示されます。1 つは彼の第 1 タームの開始年と終了年、もう 1 つは第 2 タームの年です。

私が持っている質問は以下です:

父と息子だった大統領の 2 つのペアがあります。しかし、姓を共有した大統領のペアは他にもたくさんあります。2 人以上の大統領の姓をすべて見つけてください。姓を繰り返さないでください。同じ人物が 2 つの異なる任期を務める場合 (例: Grover Cleveland) は、同じ姓を持つ 2 人の大統領のケースを構成しないことに注意してください。

私が最初に考えた答えは次のとおりです。

    SELECT lastName
    FROM Presidents
    WHERE COUNT(lastName) > 2
    EXCEPT lastName = 'Cleveland';

ただし、COUNT() 関数を WHERE 句で使用できるかどうかはよくわかりません。これは可能ですか?

ありがとう!

4

3 に答える 3

9

グループ関数をチェックするときは、WHERE の代わりに HAVING を使用します。

SELECT lastName
FROM Presidents
WHERE lastName != 'Cleveland'
GROUP BY lastName
HAVING COUNT(lastName) > 2;

ただし、このような SQL パズルを解くときは、実際のデータを考慮に入れるべきではありません。すべての一貫したデータセットで機能するはずです! これがあなたの問題に対する実際の解決策だと思います:

SELECT DISTINCT p1.lastName
FROM Presidents p1, Presidents p2
WHERE p1.lastName == p2.LastName
AND p1.firstName != p2.firstName;
于 2013-11-09T23:51:16.307 に答える
2

を使用して集計を制限しHAVINGますが、グループ化も欠落しています。

SELECT lastName
FROM Presidents
where lastName <> 'Cleveland';
group by lastname
having COUNT(lastName) > 2
于 2013-11-09T23:51:33.527 に答える