あなたは肥り過ぎ? 痩せ過ぎ? ~カットとパーティション~
これまでの2問では,
- カット
- 集約
という2つの操作が組み込まれた演算なのです注5。1つの句の中に2つの演算が組み込まれているというのもGROUP BYに対する理解を阻む一因になっているのですが,
表5 Persons
name | age | height | weight |
---|---|---|---|
Anderson | 30 | 188 | 90 |
Adela | 21 | 167 | 55 |
Bates | 87 | 158 | 48 |
Becky | 54 | 187 | 70 |
Bill | 39 | 177 | 120 |
Chris | 90 | 175 | 48 |
Darwin | 12 | 160 | 55 |
Dawson | 25 | 182 | 90 |
Donald | 30 | 176 | 53 |
あなたは,
これはつまり,
集合の要素数を調べる関数は,
リスト7 頭文字のアルファベットごとに何人がテーブルに存在するか集計するSQL
SELECT SUBSTRING(name, 1, 1) AS label,
COUNT(*)
FROM Persons
GROUP BY SUBSTRING(name, 1, 1);
図7 リスト7の実行結果
label COUNT(*) ------ --------- A 2 B 3 C 1 D 3
こういうGROUP BY句でカットして作られた1つひとつの部分集合は,
当然,
リスト8 年齢による区分を実施
SELECT CASE WHEN age < 20 THEN '子供'
WHEN age BETWEEN 21 AND 69 THEN '成人'
WHEN age > 70 THEN '老人'
ELSE NULL END AS age_class,
COUNT(*)
FROM Persons
GROUP BY CASE WHEN age < 20 THEN '子供'
WHEN age BETWEEN 21 AND 69 THEN '成人'
WHEN age > 70 THEN '老人'
ELSE NULL END;
図9 リスト8の実行結果
age_class COUNT(*) ---------- --------- 子供 1 成人 6 老人 2
カットしたい区分を,
さて,
- 注5)
- GROUP BYから集約の機能を取り去って,
カットの機能だけを残したのがPARTITION BYです。この2つの句を比較すると, 興味深いことが見えてきます。 『指南書』 の 「2-5 GROUP BYとPARTITION BY」 を参照。