DENSE_RANK

集計の構文

dense_rank_aggregate::=

分析構文

dense_rank_analytic::=

関連項目:

構文、セマンティクスおよび制限事項の詳細は、分析ファンクションを参照してください。

目的

DENSE_RANKは、順序付けされた行のグループ内の行のランクを計算し、そのランクをNUMBERとして戻します。ランクは1から始まる連続した整数です。ランクの最大値は、問合せが戻す一意の数値です。同ランクの場合、ランクの値はスキップされません。そのランク付け基準に関して同じ値を持つ行は、同じランクになります。このファンクションは、上位N番および下位N番のレポートに有効です。

このファンクションは、引数に任意の数値データ型を受け入れ、NUMBERを戻します。

  • 集計ファンクションとして使用するDENSE_RANKは、ファンクションの引数によって識別される不確定な行の稠密ランクを、与えられたソート指定で計算します。ファンクションの引数は、各集計グループの単一行を識別するため、すべての引数は各集計グループ内で定数式に評価される必要があります。定数引数式および集計のorder_by_clauseの式の位置は、一致します。このため、引数の数は同じであり、型は互換性がある必要があります。

  • 分析ファンクションとして使用するDENSE_RANKは、他の行について、問合せで戻される各行のランクを計算します。この計算は、order_by_clauseにあるvalue_exprsの値に基づいて行われます。

関連項目:

ORDER BY句の文字値を比較するためにDENSE_RANKで使用する照合を定義する照合決定ルールの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Cを参照してください。

集計の例

次の例では、サンプル表oe.employeesから、給与が$15,500であり、歩合が5%の仮想の従業員のランクを計算します。

SELECT DENSE_RANK(15500, .05) WITHIN GROUP 
  (ORDER BY salary DESC, commission_pct) "Dense Rank" 
  FROM employees;

Dense Rank
----------
         3

分析の例

次の文は、サンプル・スキーマhrの部門60の従業員を、その給与に基づいてランク付けします。給与の値が等しい従業員のランクは同じになります。ただし、ランクの値がスキップされることはありません。この例と、「RANK」の分析の例を比較してください。

SELECT department_id, last_name, salary,
       DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary) DENSE_RANK
  FROM employees WHERE department_id = 60
  ORDER BY DENSE_RANK, last_name;
 
DEPARTMENT_ID LAST_NAME                     SALARY DENSE_RANK
------------- ------------------------- ---------- ----------
           60 Lorentz                         4200          1
           60 Austin                          4800          2
           60 Pataballa                       4800          2
           60 Ernst                           6000          3
           60 Hunold                          9000          4