类别:

:doc:`/sql-reference/functions-aggregation`(通用)

MIN_BY

查找包含某列最小值的行,并返回该行中另一列的值。

例如,如果表中包含 employee_idsalary 两列,MIN_BY(employee_id, salary) 将返回 salary 列中值最小的那一行的 employee_id 列的值。

如果多行包含指定的最小值,则该函数是不确定的。

若要返回多行的值,请指定可选的 maximum_number_of_values_to_return 实参。有了这个附加实参:

  • 函数将返回一个 ARRAY,其中包含指定列中值最小的行的列值。

  • ARRAY 中的值按其在包含最小值的列中的相应值排序。

  • 如果多行包含这些最小值,则该函数是不确定的。

例如,MIN_BY(employee_id, salary, 5) 返回 employee_id 列值的 ARRAY,该列对应于包含 salary 列中最小值的 5 行。ARRAY 中的 IDs 按 salary 列中的相应值排序。

另请参阅:

MIN

语法

MIN_BY( <col_to_return>, <col_containing_mininum> [ , <maximum_number_of_values_to_return> ] )
Copy

实参

必填:

col_to_return

包含要返回的值的列。

col_containing_mininum

包含最小值的列。

可选:

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_mininum 值排序。

    例如,MIN_BY(employee_id, salary, 5) 返回工资最低的 5 名员工的 IDs,按 ``salary``(降序)排序。

使用说明

  • 该函数忽略 col_containing_mininum 中的 NULL 值。

  • 如果 col_containing_mininum 中的所有值都为 NULL,函数将返回 NULL(无论是否指定了可选的 maximum_number_of_values_to_return 实参)。

示例

以下示例演示了如何使用 MIN_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 MIN_BY(employee_id, salary) FROM employees;
Copy
+-----------------------------+
| MIN_BY(EMPLOYEE_ID, SALARY) |
|-----------------------------|
|                        1030 |
+-----------------------------+

请注意以下事项:

  • 由于不止一行包含列 salary 的最小值,因此该函数是不确定的,并且在后续执行中可能会返回不同行的员工 ID。

  • 在确定具有最小值的行时,该函数会忽略 salary 列中的 NULL 值。

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

SELECT MIN_BY(employee_id, salary, 3) FROM employees;

+--------------------------------+
| MIN_BY(EMPLOYEE_ID, SALARY, 3) |
|--------------------------------|
| [                              |
|   1030,                        |
|   2020,                        |
|   1020                         |
| ]                              |
+--------------------------------+
Copy

如示例所示,ARRAY 中的值按其在 salary 列中的相应值排序。因此,MIN_BY 返回按工资升序排序的员工的 IDs。

如果这些行中有多个行在 salary 列中包含相同的值,则返回的该工资值的顺序是不确定的。

语言: 中文