グループ化 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まずレコードを1件ずつ確認し、価格が25より大きいすべてのレコードを絞り込み、その後で初めてGROUP BY句を実行し、平均価格が40より大きいすべてのカテゴリを絞り込みます。
チャレンジ
中級利用可能なテーブルと列:
earthquakes:location,amplitude,period
リヒタースケールは、地震のマグニチュードを測定するために使われる対数スケールです。
すべての大地震について、各場所の平均マグニチュードを返す必要があります。
大地震は次のように定義されます:
- 振幅が1以上である
- 波の周期が1分以上である
この課題では、異なる式 M = (A/T)^2 / T を使用します。これは M = ((A/T)*(A/T)) / T と同等です。ここで、M はマグニチュード、A は amplitude 列、T は period 列です。
大地震のみを含めて、各場所とその平均マグニチュードを返してください(列名は avg_magnitude)。結果には、avg_magnitude が1より大きい場所のみを含めてください。
結果を小数点以下2桁に丸めてください。
自分で試してみよう
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: SQLプレイグラウンド