説明
この関数は、一連の値における特定の値の累積分布を計算するために使用されます。CUME_DIST 関数と似ています。この関数は集計または分析関数として使用できます。
集計関数として、
PERCENT_RANKはある数値が集合内で占める位置のパーセンテージを計算します。その戻り値の範囲は (0, 1] です。データ行がN行あり、exprの値が2行目より大きく3行目より小さい場合、位置のパーセンテージは2/Nに等しくなります。定数パラメータ式とORDER BY集計句の式は位置に応じてマッチングされます。したがって、パラメータの数は同じでなければならず、その型も互換性がある必要があります。指定された値がグループ化シーケンス内の特定の値と重複する場合、2つの同一の値は1つの値として扱われます。分析関数として、
PERCENT_RANKは特定の列または列の組み合わせに対する各行のパーセンテージ順序を計算します。その戻り値の範囲は [0, 1] です。同じ順序値がある場合、同じランクが付けられ、値が同じ行数は次のランクに記録されます。任意の集合の最初の行のPERCENT_RANK関数は0であり、位置のパーセンテージの計算式は次のとおりです:位置のパーセンテージ = 番号 / 最大番号。具体的な例については、以下の表を参照してください:N 番号 位置の割合 A 0 0 B 1 0.25 C 2 0.5 D 3 0.75 E 4 1
構文
/*集計構文*/
PERCENT_RANK(expr [, expr ...]) WITHIN GROUP
( ORDER BY expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]
[,expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]]...
)
/*分析構文*/
PERCENT_RANK( ) OVER ([query_partition_clause] order_by_clause)
パラメータの説明
| パラメータ | 説明 |
|---|---|
| expr | クエリ対象の値を指定します。 |
| expr_col | クエリ対象の値に対応する列名を指定します。 |
| DESC | ASC | 列のソート方法を指定します。オプションです。
|
| NULLS { FIRST | LAST } | ソート後の expr_col 内の NULL 値の位置を指定します。オプションです。
|
| OVER | OVER 句を使用してウィンドウを定義し、計算を行います。詳細については、分析関数の説明を参照してください。 |
返り値の型
NUMBERデータ型を返します。
例
既に作成されたテーブル emp_msg があります。
obclient> SELECT * FROM emp_msg;
+--------+--------+------+------+
| DEPTNO | ENAME | SAL | MGR |
+--------+--------+------+------+
| 10 | CLARK | 2750 | 7839 |
| 10 | KING | 5300 | NULL |
| 10 | MILLER | 1600 | 7782 |
| 20 | ADAMS | 1400 | 7788 |
| 20 | FORD | 3300 | 7566 |
| 20 | JONES | 3275 | 7839 |
| 20 | SCOTT | 3300 | 7566 |
| 20 | SMITH | 1100 | 7902 |
| 30 | ALLEN | 1900 | 7698 |
| 30 | BLAKE | 3150 | 7839 |
| 30 | JAMES | 1250 | 7698 |
| 30 | MARTIN | 1550 | 7698 |
| 30 | TURNER | 1800 | 7698 |
| 30 | WARD | 1550 | 7698 |
| 30 | SCLARK | 1750 | 7839 |
+--------+--------+------+------+
15 rows in set
集計関数の例
列 sal 内の 3300 の位置パーセンテージを返します。
obclient> SELECT PERCENT_RANK(3300) WITHIN GROUP (ORDER BY sal) FROM emp_msg;
+-------------------------------------------+
| PERCENT_RANK(3300)WITHINGROUP(ORDERBYSAL) |
+-------------------------------------------+
| .8 |
+-------------------------------------------+
1 row in set
分析関数の例
列 deptno でグループ化し、列 sal を降順にソートして、列 sal 内の各値の位置パーセンテージを返します。
obclient> SELECT deptno,ename,sal,
PERCENT_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS pr1
FROM emp_msg;
+--------+--------+------+-------------------------------------------+
| DEPTNO | ENAME | SAL | PR1 |
+--------+--------+------+-------------------------------------------+
| 10 | KING | 5300 | 0 |
| 10 | CLARK | 2750 | .5 |
| 10 | MILLER | 1600 | 1 |
| 20 | FORD | 3300 | 0 |
| 20 | SCOTT | 3300 | 0 |
| 20 | JONES | 3275 | .5 |
| 20 | ADAMS | 1400 | .75 |
| 20 | SMITH | 1100 | 1 |
| 30 | BLAKE | 3150 | 0 |
| 30 | ALLEN | 1900 | .1666666666666666666666666666666666666667 |
| 30 | TURNER | 1800 | .3333333333333333333333333333333333333333 |
| 30 | SCLARK | 1750 | .5 |
| 30 | MARTIN | 1550 | .6666666666666666666666666666666666666667 |
| 30 | WARD | 1550 | .6666666666666666666666666666666666666667 |
| 30 | JAMES | 1250 | 1 |
+--------+--------+------+-------------------------------------------+
15 rows in set