类别:

聚合函数 (通用)

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) 返回 employee_id 列值的 ARRAY,该列对应于包含 salary 列中最大值的 5 行。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,函数将返回一个 ARRAY,其中包含与 col_to_return 类型相同的值。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 值。

以下示例返回一个 ARRAY,其中包含工资最高的 3 名员工的 IDs:

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 列中包含相同的值,则返回的该工资值的顺序是不确定的。

语言: 中文