グループ化 2
CoddyのSQLジャーニー「基礎」セクションの一部。レッスン 37/72。
WHEREキーワードは、各レコードに対して個別に条件を実行します。例:
SELECT * FROM table1
WHERE col1 > col2col1 > col2はすべてのレコードに対して実行され、条件を満たしているかどうかを確認します。
しかし、集計結果をフィルタリングしたい場合はどうすればよいでしょうか? たとえば、次のようになります。
SELECT category, AVG(price) FROM table1
WHERE AVG(price) > 40
GROUP BY categoryこれは機能しません。WHEREでは集約をチェックできないためです。そのために、HAVINGキーワードがあります。これは集約条件によってデータをフィルタリングします。
SELECT category, AVG(price) FROM table1
GROUP BY category
HAVING AVG(price) > 40これは、平均価格が40を超えるすべてのカテゴリを絞り込みます。
HAVING句とWHERE句を組み合わせる場合は、次のように記述します。
SELECT category, AVG(price) FROM table1
WHERE price > 25
GROUP BY category
HAVING AVG(price) > 40まずレコードごとに処理を行い、価格が25より大きいすべてのレコードをフィルタリングします。その後で初めてGROUP BY句を実行し、平均価格が40より大きいすべてのカテゴリをフィルタリングします。
チャレンジ
中級利用可能なテーブルと列:
earthquakes:location、amplitude、period
リヒター・スケールは、地震のマグニチュードを測定するために使用される対数スケールです。
すべての主要な地震について、各場所の平均マグニチュードを返す必要があります。
主要な地震は、次のように定義されます:
- 振幅が1以上である
- 波の周期が1分以上である
このチャレンジでは、別の式を使用します:M = (A/T)<sup>2</sup> / T。これはM = ((A/T)*(A/T)) / Tと同等です。
各場所の場所と平均マグニチュードを返し、主要な地震のみを含めます(列名はavg_magnitudeとします)。結果には、avg_magnitudeが1より大きい場所のみを含めてください。
結果を小数点以下2桁に丸めてください。
自分で試してみよう
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: SQLプレイグラウンド