カテゴリ:

集計関数 (一般)

MAX_BY

列の最大値を含む行を探し、その行にある別の列の値を返します。

たとえば、テーブルに列 employee_idsalary が含まれている場合、 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

構文

MAX_BY( <col_to_return>, <col_containing_maximum> [ , <maximum_number_of_values_to_return> ] )
Copy

引数

必須:

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);
Copy

次のステートメントを実行して、このテーブルの内容を表示します。

SELECT * FROM employees;
Copy
+-------------+---------------+--------+
| 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;
Copy
+-----------------------------+
| MAX_BY(EMPLOYEE_ID, SALARY) |
|-----------------------------|
|                         900 |
+-----------------------------+

次の点に注意してください。

  • 複数の行に salary 列の最大値が含まれているため、関数は非決定的であり、後続の実行で別の行の従業員 ID を返す可能性があります。

  • 関数は、最大値を持つ行を決定するときに、 salary 列の NULL 値を無視します。

次の例は、給与が最も高い従業員3人の IDs を含む ARRAY を返します。

SELECT MAX_BY(employee_id, salary, 3) from employees;
Copy
+--------------------------------+
| MAX_BY(EMPLOYEE_ID, SALARY, 3) |
|--------------------------------|
| [                              |
|   900,                         |
|   2010,                        |
|   1001                         |
| ]                              |
+--------------------------------+

例に示すように、 ARRAY の値は、 salary 列の対応する値で並べ替えられます。つまり、 MAX_BY は、給与で降順に並べ替えた従業員の IDs を返します。

これらの行の複数で salary 列に同じ値が含まれている場合、その給与に対して返される値の順序は非決定的です。