Skip to content

SQL集計関数 解説

SQLの集計関数、GROUP BY、HAVING、そしてdistinct・高度な集計を、戻り値とordersテーブルでの一行例にマッピングしてまとめました。

集計関数は多数の行を単一のスカラー結果にまとめます。GROUP BYは集計前にキーで行を分割します。HAVINGは集計後にグループを絞り込みます。NULL入力はCOUNT(*)を除くすべての集計でスキップされます。

リファレンステーブル · 29 項目
29 of 29 rows
スカラー
NULLでない入力値の個数。COUNT(*)はすべての行を数えます。SELECT COUNT(*) FROM orders
NULLでない数値の合計。空の集合ではNULLを返します。SELECT SUM(total) FROM orders
NULLでない数値の相加平均。NULL入力は無視されます。SELECT AVG(total) FROM orders
比較可能な任意の型におけるNULLでない最小値。SELECT MIN(total) FROM orders
比較可能な任意の型におけるNULLでない最大値。SELECT MAX(total) FROM orders
グループ化
入力行をキーで分割し、集計は分割ごとに実行されます。SELECT user_id, SUM(total) FROM orders GROUP BY user_id
集計後にグループごとに評価される述語。集計にはWHEREの代わりに使います。SELECT user_id, COUNT(*) FROM orders GROUP BY user_id HAVING COUNT(*) > 5
1回のパスでグループごとに複数の集計を計算します。SELECT user_id, COUNT(*), SUM(total), AVG(total) FROM orders GROUP BY user_id
1つの文で複数のグループ化を計算します。現在のセット外のキーはNULLを返します。SELECT user_id, region, SUM(total) FROM orders GROUP BY GROUPING SETS ((user_id), (region), ())
階層ベースのグルーピングセットの略記。小計と総合計を追加します。SELECT region, user_id, SUM(total) FROM orders GROUP BY ROLLUP (region, user_id)
列挙したキーのすべての組み合わせをグルーピングセットとして生成する略記。SELECT region, user_id, SUM(total) FROM orders GROUP BY CUBE (region, user_id)
通常のグループキーとグルーピングセットを1つの句で混ぜます。SELECT user_id, region, SUM(total) FROM orders GROUP BY user_id, GROUPING SETS ((region), ())
ソート順でキーごとに最初の行を保持します。Postgresの拡張です。SELECT DISTINCT ON (user_id) user_id, total FROM orders ORDER BY user_id, created_at DESC
Distinctと高度な集計
一意なNULLでない値の個数。先に重複を除去します。SELECT COUNT(DISTINCT user_id) FROM orders
有限の誤差でdistinct値の個数を推定します。大規模入力向けです。SELECT APPROX_COUNT_DISTINCT(user_id) FROM orders
NULLでない文字列を区切り文字で連結します。SELECT STRING_AGG(user_id::text, ',') FROM orders
NULLでない文字列を連結します。STRING_AGGのMySQLでの名前です。SELECT GROUP_CONCAT(user_id SEPARATOR ',') FROM orders
NULLでない入力値を配列に収集します。SELECT ARRAY_AGG(total) FROM orders
入力行をJSON配列に収集します。JSONB形式は解析済みのバイナリを格納します。SELECT JSONB_AGG(user_id) FROM orders
すべて / いずれかのNULLでない入力値が真のときTRUE。SELECT BOOL_AND(total > 0), BOOL_OR(total > 100) FROM orders
BOOL_ANDの標準の別名。SELECT EVERY(total > 0) FROM orders
ソート済み入力上の補間 / 最近接順位のパーセンタイル。WITHIN GROUPが必要です。SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total) FROM orders
最も頻出する入力値。Postgresでは順序集合集計です。SELECT MODE() WITHIN GROUP (ORDER BY total) FROM orders
順序集合集計と仮想集合集計にソート順を渡します。SELECT RANK(500) WITHIN GROUP (ORDER BY total) FROM orders
集計を条件を満たす行に限定します。SELECT COUNT(*) FILTER (WHERE total > 100) FROM orders
集計が値を連結・収集する前に並べ替えます。SELECT STRING_AGG(user_id::text, ',' ORDER BY user_id) FROM orders
COUNT(*)とCOUNT(1)はすべての行を数え、COUNT(col)はNULL入力をスキップします。SELECT COUNT(*), COUNT(total), COUNT(1) FROM orders
NULLでない数値の標本標準偏差。STDDEV_POPが母集団形式で、裸の名前の既定はエンジンごとに異なります。SELECT STDDEV(total) FROM orders
NULLでない数値の標本分散(STDDEVの2乗)。VAR_SAMPとVAR_POPが各形式を明示します。SELECT VARIANCE(total) FROM orders