- カテゴリ:
- 集計関数 (一般) 
MAX_BY¶
列の最大値を含む行を探し、その行にある別の列の値を返します。
たとえば、テーブルに列 employee_id と salary が含まれている場合、 MAX_BY(employee_id, salary) は salary 列の値が最も大きい行の employee_id 列の値を返します。
指定された最大値が複数の行に含まれている場合、関数は非決定的です。
複数行の値を返すには、オプションの maximum_number_of_values_to_return 引数を指定します。この追加の引数を使用すると、
- この関数は、指定された列の最大値を持つ行の列の値を含む ARRAY を返します。 
- ARRAY の値は、最大値を含む列の対応する値で並べ替えられます。 
- 複数の行にこれらの最大値が含まれている場合、関数は非決定的です。 
たとえば、 MAX_BY(employee_id, salary, 5) は、 salary 列の最大値を含む5行に対する employee_id 列の値の ARRAY を返します。ARRAY の IDs は、 salary 列の対応する値で並べ替えられます。
- こちらもご覧ください:
構文¶
MAX_BY( <col_to_return>, <col_containing_maximum> [ , <maximum_number_of_values_to_return> ] )
引数¶
必須:
- col_to_return
- 返す値を含む列。 
- col_containing_maximum
- 最大値を含む列。 
オプション:
- maximum_number_of_values_to_return
- 返される値の最大数を指定する整数定数。正の数を指定する必要があります。指定できる最大数は - 1000です。
戻り値¶
- maximum_number_of_values_to_returnが指定されていない場合、関数は- col_to_returnと同じ型の値を返します。
- maximum_number_of_values_to_returnが指定されている場合、関数は- col_to_returnと同じ型の値を含む ARRAY を返します。ARRAY の値は、対応する- col_containing_maximum値で並べ替えられます。- たとえば、 - MAX_BY(employee_id, salary, 5)は、給与が最も高い従業員5人の IDs を- salaryで(降順で)並べ替えて返します。
使用上の注意¶
- この関数は、 - col_containing_maximumの NULL 値を無視します。
- col_containing_maximumのすべての値が NULL の場合、関数は NULL を返します(オプションの- maximum_number_of_values_to_return引数が指定されているかどうかに関係なく)。
例¶
次の例は、MAX_BY 関数の使用方法を説明しています。
これらの例を実行するには、次のステートメントを実行して、例に対するテーブルとデータを設定します。
CREATE OR REPLACE TABLE employees(employee_id NUMBER, department_id NUMBER, salary NUMBER);
INSERT INTO employees VALUES
  (1001, 10, 10000),
  (1020, 10, 9000),
  (1030, 10, 8000),
  (900, 20, 15000),
  (2000, 20, NULL),
  (2010, 20, 15000),
  (2020, 20, 8000);
次のステートメントを実行して、このテーブルの内容を表示します。
SELECT * FROM employees;
+-------------+---------------+--------+
| EMPLOYEE_ID | DEPARTMENT_ID | SALARY |
|-------------+---------------+--------|
|        1001 |            10 |  10000 |
|        1020 |            10 |   9000 |
|        1030 |            10 |   8000 |
|         900 |            20 |  15000 |
|        2000 |            20 |   NULL |
|        2010 |            20 |  15000 |
|        2020 |            20 |   8000 |
+-------------+---------------+--------+
次の例は、給与が最も高い従業員の ID を返します。
SELECT MAX_BY(employee_id, salary) FROM employees;
+-----------------------------+
| MAX_BY(EMPLOYEE_ID, SALARY) |
|-----------------------------|
|                         900 |
+-----------------------------+
次の点に注意してください。
- 複数の行に - salary列の最大値が含まれているため、関数は非決定的であり、後続の実行で別の行の従業員 ID を返す可能性があります。
- 関数は、最大値を持つ行を決定するときに、 - salary列の NULL 値を無視します。
次の例は、給与が最も高い従業員3人の IDs を含む ARRAY を返します。
SELECT MAX_BY(employee_id, salary, 3) from employees;
+--------------------------------+
| MAX_BY(EMPLOYEE_ID, SALARY, 3) |
|--------------------------------|
| [                              |
|   900,                         |
|   2010,                        |
|   1001                         |
| ]                              |
+--------------------------------+
例に示すように、 ARRAY の値は、 salary 列の対応する値で並べ替えられます。つまり、 MAX_BY は、給与で降順に並べ替えた従業員の IDs を返します。
これらの行の複数で salary 列に同じ値が含まれている場合、その給与に対して返される値の順序は非決定的です。
MIN_BYおよびMAX_BY集計関数の使用 もご参照ください。