私はMicrosoft SQL Server 2012(熟練問題ではない)でSQLを練習しており、テーブルを持っています Names
。表には、年ごとの赤ちゃんの名前と列 Sex
(名前の性別)、 N
(その名前の赤ちゃんの数)、 Yr
(年)、および Name
(名前そのもの)。
私は1つだけを使用してクエリを書く必要があります SELECT
性別、年、名前のある赤ちゃんの数と一緒に、最も人気のある赤ちゃんの名前を年別に返します。これまでのところ私は持っている。
SELECT *
From Names
ORDER By N DESC;
DESCでNの最高値を与えるもの注文、繰り返し年。私はそれを毎年最高値に制限する必要があります。私がしようとしたことはすべてエラーを投げかけています。あなたが私に与えることができるどんなアドバイスも感謝します。
回答:
回答№1は0私の頭の上から離れて次のようなものは、通常、(技術的に)1つのSELECT文でそれを行うことができます。そのステートメントにはサブSELECTが含まれていますが、私はすぐにはそうではない代替案を見ていません。
ジョイントトップランクの名前があれば、両方クエリはすべての上位の結果を戻す必要があります。したがって、1つの答えが正確に存在しない可能性があります。これらの結果からランダムに1つの代表行が必要な場合は、 select top 1
、おそらく order by
最初のアルファベット順を取得します。
性別にかかわらず年々人気がある:
-- ONE PER YEAR:
SELECT n.Year, n.Name, n.Gender, n.Qty FROM Name n
WHERE NOT EXISTS (
SELECT 1 FROM Name n2
WHERE n2.Year = n.Year
AND n2.Qty > n.Qty
)
各性別毎年最も人気がある:
-- ONE PER GENDER PER YEAR:
SELECT n.Year, n.Name, n.Gender, n.Qty FROM Name n
WHERE NOT EXISTS (
SELECT 1 FROM Name n2
WHERE n2.Year = n.Year
AND n2.Gender = n.Gender
AND n2.Qty > n.Qty
)
パフォーマンスは、SQLの冗長性にもかかわらず、通常はこのパターンを使用する際の代替案と同等です(しばしばより良い)。
GROUP文の使用を含む他のアプローチがありますが、個人的に私はこれをより読みやすく、標準的なクロスDBMSと見ています。