説明
この関数は、値の集合における1つの値のランクを計算します。同じソート値が存在する場合、その値には同じランクが付与され、値が同じ行数は次のランクに記録されます。この関数は集約または分析関数として使用できます。
説明
- 集約関数として、
RANKパラメータexprで識別される仮想行に対し、指定されたソート規範に基づいてランクを計算します。パラメータ式exprとORDER BY集約句内の式は位置によってマッチします。したがって、パラメータの数は同じでなければならず、データ型も互換性がある必要があります。 - 解析関数として、
RANKクエリによって返される他の各行に対して、クエリから返される各行のランクを計算します。これは、value_exprs内の値に基づいてorder_by_clauseされます。
構文
/*集約構文*/
RANK(expr [, expr ]...) WITHIN GROUP
( ORDER BY
expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]
[, expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]]...
)
/*分析構文*/
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 RANK(3300) WITHIN GROUP (ORDER BY sal) FROM emp_msg;
+-----------------------------------+
| RANK(3300)WITHINGROUP(ORDERBYSAL) |
+-----------------------------------+
| 13 |
+-----------------------------------+
1 row in set
分析関数の例
列 deptno でグループ化し、列 sal を降順にソートして、列 sal 内の各値のランキングを返します。
obclient> SELECT deptno,ename,sal,
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) "RANK"
FROM emp_msg;
+--------+--------+------+------+
| DEPTNO | ENAME | SAL | RANK |
+--------+--------+------+------+
| 10 | KING | 5300 | 1 |
| 10 | CLARK | 2750 | 2 |
| 10 | MILLER | 1600 | 3 |
| 20 | FORD | 3300 | 1 |
| 20 | SCOTT | 3300 | 1 |
| 20 | JONES | 3275 | 3 |
| 20 | ADAMS | 1400 | 4 |
| 20 | SMITH | 1100 | 5 |
| 30 | BLAKE | 3150 | 1 |
| 30 | ALLEN | 1900 | 2 |
| 30 | TURNER | 1800 | 3 |
| 30 | SCLARK | 1750 | 4 |
| 30 | MARTIN | 1550 | 5 |
| 30 | WARD | 1550 | 5 |
| 30 | JAMES | 1250 | 7 |
+--------+--------+------+------+
15 rows in set