「HAVING」 < グルーピングデータから特定条件で抽出する方法 >
前回グルーピングする「GROUP BY」の利用方法を教わったのですが、そのグルーピングしたデータから特定の条件でデータを抽出する方法はないのでしょうか?
WHERE句でグルーピングデータを条件指定するとエラーになってしまいます…
いい質問ですね!
グルーピングからさらに条件の抽出は「HAVING」を使用します。
では、実際のデータを用いてやってみましょう!
以下のデータは、1896年から2016年までに開催された全オリンピックのアスリートとイベントのデータです。(テーブル名:OLYMPICS_athlete_events)
OLYMPICS_athlete_events | テーブル名 |
---|---|
ID | データセット内の順番に基づいてアスリートに割り当てられたID番号 |
Name | アスリートの名前 |
Sex | アスリートの性別 |
Age | アスリートの年齢 |
Height | アスリートの身長(センチメートル単位) |
Weight | アスリートの体重(キログラム単位) |
Team | このアスリートが所属する国 |
NOC | アスリートが所属する国を表す3文字の略語 |
Games | このオリンピック大会の開催年と季節 |
Year | 大会の開催年 |
Season | 大会の季節(SummerまたはWinter) |
City | オリンピックが開催された都市 |
Sport | 大会の種目 |
Event | 大会の名前 |
Medal | アスリートが獲得したメダル(獲得したメダルがない場合は「NA」) |
まずは前回のグルーピングと集計のおさらいです。
例えば、金メダルを獲得した人の国籍ごとの平均身長を集計してみましょう。
「GROUP BY」と「count」「avg」を使用します。
以下のようにSQLを記述します。
国籍をグルーピングして、国籍ごとにレコード数を集計し、身長の平均を抽出する。
(条件:金メダル獲得者、年齢がNA値以外、Teamレコード数降順、データ数20件制限)
SELECT Team,Medal
,count(Team)
,avg(Height)
FROM OLYMPICS_athlete_events
WHERE Medal = 'Gold' AND Height != 'NA'
GROUP BY Team
ORDER BY count(Team) DESC
LIMIT 20;
ここからが本題です。この中から身長平均が180以上の国を抽出してみましょう。
ここで「HAVING」が登場します。
集計データから条件抽出を行う
国籍をグルーピングして、国籍ごとにレコード数を集計し、身長の平均を抽出する。
(条件:金メダル獲得者、身長がNA値以外、Teamレコード数降順、データ数20件制限、身長平均が180cm以上)
SELECT Team,Medal
,count(Team)
,avg(Height)
FROM OLYMPICS_athlete_events
WHERE Medal = 'Gold' AND Height != 'NA'
GROUP BY Team
HAVING avg(Height) >= 180
ORDER BY count(Team) DESC
LIMIT 20;
なるほど〜、グルーピングして集計したデータから特定条件を用いるときはHAVINGを使用するんですね!
そういうことです。
また、コマンド実行順序は以下の順になります
演習
それでは演習をしてみましょう。
準備中
まとめ
- グルーピングデータから特定条件の抽出:HAVING
- 「HAVING」は「GROUP BY」の後に記述する
未経験からデータサイエンティストへ!転職支援!
ROYAL AGENT&Co.では、全コンサルタントが5年以上のキャリアコンサルティング経験を持ち、データサイエンティストやAI,DX人材のご紹介に強い転職支援を行っております。
候補者様一人ひとりのキャリアに寄り添ったご支援を心がけ、無闇に求人をご紹介するのではなく、丁寧なカウンセリングを通してご志向性にあった求人をピンポイントにご紹介させて頂いております。未経験からのデータサイエンティスト転職支援実績も多数ございます。
無理な勧誘など一切ありませんので、キャリアのご相談等、まずはお気軽にお問合せください!心よりお待ちしております。