APPROX_PERCENTILE
目的
APPROX_PERCENTILE
は、近似逆分散ファンクションです。これは、パーセンタイル値およびソート指定を取得し、そのソート指定に従ってそのパーセンタイル値に該当する値を戻します。計算では、NULLは無視されます
このファンクションは、PERCENTILE_CONT
およびPERCENTILE_DISC
ファンクションの代替機能として、正確な結果を戻します。APPROX_PERCENTILE
は、正確な結果とわずかに誤差がありますが、PERCENTILE_CONT
やPERCENTILE_DISC
よりはるかに高速に大量のデータを処理します。
最初のexpr
はパーセンタイル値であり、0から1の数値に評価される必要があります。
ORDER
BY
に含まれる2番目のexpr
は単一式であり、このファンクションではこの式を使用して結果を計算します。expr
で許容されるデータ型と、このファンクションの戻り値データ型は、DETERMINISTIC
句で指定するアルゴリズムによって異なります。
DETERMINISTIC
この句を使用すると、このファンクションで使用するアルゴリズムのタイプを指定して、戻り値を計算できます。
-
DETERMINISTIC
を指定すると、このファンクションによって、決定的な結果が計算されます。この場合、ORDER
BY
句式は、数値または-2,147,483,648から2,147,483,647の範囲の数値に暗黙的に変換可能な値に評価される必要があります。このファンクションは、数値入力を最も近い整数に丸めます。また、ORDER
BY
句式の数値データ型と同じデータ型を戻します。戻り値は、必ずしもexpr
の値のいずれかであるとはかぎりません。 -
DETERMINSTIC
を指定しないと、このファンクションによって、非決定的な結果が計算されます。この場合、ORDER
BY
句式は、数値または日時値、あるいは数値または日時値に暗黙的に変換可能な値に評価される必要があります。また、ORDER
BY
句式の数値または日時データ型と同じデータ型を戻します。戻り値は、expr
の値のいずれかとなります。
ERROR_RATE | CONFIDENCE
これらの句を使用すると、このファンクションによって計算される結果の精度を決定できます。これらの句のいずれかを指定すると、expr
に指定したパーセンタイル値に該当する値が戻されるかわりに、次のいずれかの値を表す0から1までの10進値(それらの値を含む)が戻されます。
-
ERROR_RATE
を指定すると、戻り値は、expr
に指定されたパーセンタイル値に該当する値の計算におけるエラー率を表します。 -
CONFIDENCE
を指定すると、戻り値は、ERROR_RATE
を指定したときに戻されるエラー率の信頼水準を表します。
DESC | ASC
指定されたパーセンタイル値に該当する値を計算するためのソート指定を設定します。DESC
を指定するとORDER
BY
句式の値を降順でソートでき、ASC
を指定すると値を昇順でソートできます。デフォルトはASC
です。
関連項目:
-
「PERCENTILE_CONT」および「PERCENTILE_DISC」を参照してください。
-
「APPROX_MEDIAN」を参照してください。これは、パーセンタイル値が0.5に指定される特別な
APPROX_PERCENTILE
です。
例
次の問合せは、hr
.employees
表内の部門ごとに、決定的な近似の25パーセンタイル、50パーセンタイルおよび75パーセンタイルの給与を戻します。補間計算では、給与は昇順でソートされます。
SELECT department_id "Department", APPROX_PERCENTILE(0.25 DETERMINISTIC) WITHIN GROUP (ORDER BY salary ASC) "25th Percentile Salary", APPROX_PERCENTILE(0.50 DETERMINISTIC) WITHIN GROUP (ORDER BY salary ASC) "50th Percentile Salary", APPROX_PERCENTILE(0.75 DETERMINISTIC) WITHIN GROUP (ORDER BY salary ASC) "75th Percentile Salary" FROM employees GROUP BY department_id ORDER BY department_id; Department 25th Percentile Salary 50th Percentile Salary 75th Percentile Salary ---------- ---------------------- ---------------------- ---------------------- 10 4400 4400 4400 20 6000 6000 13000 30 2633 2765 3100 40 6500 6500 6500 50 2600 3100 3599 60 4800 4800 6000 70 10000 10000 10000 80 7400 9003 10291 90 17000 17000 24000 100 7698 7739 8976 110 8300 8300 12006 7000 7000 7000
次の問合せは、前の問合せで計算された近似の25パーセンタイル給与におけるエラー率を戻します。
SELECT department_id "Department", APPROX_PERCENTILE(0.25 DETERMINISTIC, 'ERROR_RATE') WITHIN GROUP (ORDER BY salary ASC) "Error Rate" FROM employees GROUP BY department_id ORDER BY department_id; Department Error Rate ---------- ---------- 10 .002718282 20 .021746255 30 .021746255 40 .002718282 50 .019027973 60 .019027973 70 .002718282 80 .021746255 90 .021746255 100 .019027973 110 .019027973 .002718282
次の問合せは、前の問合せで計算されたエラー率について信頼水準を戻します。
SELECT department_id "Department", APPROX_PERCENTILE(0.25 DETERMINISTIC, 'CONFIDENCE') WITHIN GROUP (ORDER BY salary ASC) "Confidence" FROM employees GROUP BY department_id ORDER BY department_id; Department Confidence ---------- ---------- 10 .997281718 20 .999660215 30 .999660215 40 .997281718 50 .999611674 60 .999611674 70 .997281718 80 .999660215 90 .999660215 100 .999611674 110 .999611674 .997281718
次の問合せは、hr
.employees
表内の部門ごとに、非決定的な近似の25パーセンタイル、50パーセンタイルおよび75パーセンタイルの給与を戻します。補間計算では、給与は昇順でソートされます。
SELECT department_id "Department", APPROX_PERCENTILE(0.25) WITHIN GROUP (ORDER BY salary ASC) "25th Percentile Salary", APPROX_PERCENTILE(0.50) WITHIN GROUP (ORDER BY salary ASC) "50th Percentile Salary", APPROX_PERCENTILE(0.75) WITHIN GROUP (ORDER BY salary ASC) "75th Percentile Salary" FROM employees GROUP BY department_id ORDER BY department_id; Department 25th Percentile Salary 50th Percentile Salary 75th Percentile Salary ---------- ---------------------- ---------------------- ---------------------- 10 4400 4400 4400 20 6000 6000 13000 30 2600 2800 3100 40 6500 6500 6500 50 2600 3100 3600 60 4800 4800 6000 70 10000 10000 10000 80 7300 8800 10000 90 17000 17000 24000 100 7700 7800 9000 110 8300 8300 12008 7000 7000 7000