概要:このチュートリアルでは、SQL CUME_DIST()
関数を使用して、行の累積分布値を計算する方法を学習します。
SQL CUME_DIST() 関数の紹介
CUME_DIST()
は、値の集合内で値の累積分布を計算するウィンドウ関数です。
CUME_DIST()
関数は、現在の行の値以下の(<=
)値を持つ行数を、行の総数で割った値を返します。
N / total_rows
Code language: SQL (Structured Query Language) (sql)
この式では
N
は、現在の行の値以下の値を持つ行数です。total_rows
は、評価対象のパーティションまたは結果セット内の行数です。
CUME_DIST()
関数の戻り値の範囲は、0より大きい最小値と1以下の最大値です。
0 < CUME_DIST() <= 1
Code language: SQL (Structured Query Language) (sql)
繰り返される列の値は、同じ CUME_DIST()
値を受け取ります。
CUME_DIST()
関数の構文は次のとおりです。
CUME_DIST() OVER (
PARTITION BY expr1, expr2 ...
ORDER BY expr1 [ASC | DESC], expr2...
)
Code language: SQL (Structured Query Language) (sql)
この構文では
- まず、
PARTITION BY
句は結果セットをパーティションに分割します。PARTITION BY
句を省略すると、関数は結果セット全体を単一のパーティションとして扱います。 - 次に、
ORDER BY
句は各パーティション内の行をソートします。 - 最後に、
CUME_DIST()
関数が、ソートされた各パーティションに独立して適用されます。
SQL CUME_DIST() 関数の例
サンプルデータベースから、次の employees
テーブルと departments
テーブルを参照してください。

次のステートメントは、デモンストレーションのために、employees
テーブルと departments
テーブルに基づいて department_headcounts
という名前のビューを作成します。
CREATE VIEW department_headcounts
AS
SELECT
department_name,
COUNT(employee_id) headcount
FROM
employees e
INNER JOIN departments d
ON d.department_id = e.department_id
GROUP BY
e.department_id;
Code language: SQL (Structured Query Language) (sql)
次のステートメントは、各部門の従業員数による累積分布値を求めます。
SELECT
department_name,
headcount,
ROUND(
CUME_DIST() OVER (
ORDER BY headcount
)
,2) cume_dist_val
FROM
department_headcounts;
Code language: SQL (Structured Query Language) (sql)
出力は次のとおりです。

この例では、部門は従業員数の昇順でソートされています。結果セットの行の合計は11です。
Administration
部門の従業員数は1人です。 Human Resources
と Public Relations
も Administration
と同じ従業員数です。結果として、従業員数が1人の部門が3つあります。 CUME_DIST()
関数は、次の式を使用して最初の行の累積分布値を計算します。
3 / 11 = 0.27
Code language: SQL (Structured Query Language) (sql)
同じロジックが2行目と3行目にも適用されます。
Marketing
部門の従業員数は2人です。関数は、従業員数が2人以下の他の部門を見つけます。結果は5です。したがって、Marketing
部門の CUME_DIST()
は 5 / 11 = 0.45 です。
同じロジックが残りの行に適用されます。
このチュートリアルでは、SQL CUME_DIST()
関数を使用して、値の集合内の値の累積分布を計算する方法を学習しました。