MAX_BY

更新时间:
复制 MD 格式

MAX_BY函数返回valueToMaximize列中最大值对应的valueToReturn列的值。此函数为MaxCompute 2.0扩展函数。

命令格式

MAX_BY(<valueToReturn>, <valueToMaximize>)

功能介绍

MAX_BY 函数返回 valueToMaximize 取最大值时对应行的 valueToReturn 值。即在所有行中找到 valueToMaximize 最大的那一行,返回该行的 valueToReturn。

MAX_BY 与ARG_MAX 功能相同,参数顺序不同。MAX_BY 兼容开源语法。

在同一条SQL语句中同时使用多个聚合函数时,如果项目资源不足,会出现内存溢出问题,请根据实际业务情况优化SQL或购买计算资源。

参数说明

  • valueToMaximize:必填。可以为任意类型。用于比较大小、确定目标行的列或表达式。

  • valueToReturn:必填。可以为任意类型。从目标行中取出并返回的值。

说明

如果函数涉及新数据类型(TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMPBINARY),在使用扩展函数时,需要执行相关语句开启2.0数据类型开关:

  • Session级别:在SQL语句前添加SET odps.sql.type.system.odps2=true;,并与SQL语句一起提交执行。

  • Project级别:项目所有者通过setproject odps.sql.type.system.odps2=true;设置整个项目的数据类型。

返回值说明

返回值类型与valueToReturn类型相同。若存在多行并列最大值,随机返回其中一行的值。valueToMaximize 为 NULL 的行不参与计算。

使用示例

示例数据

  1. 创建表 dept_sal

    CREATE TABLE IF NOT EXISTS dept_sal (
     deptno BIGINT,
     ename STRING,
     sal BIGINT
     );
  2. 插入测试数据

    INSERT INTO dept_sal VALUES
          (10, 'KING',   5000),
          (10, 'CLARK',  2450),
          (10, 'MILLER', 1300),
          (20, 'SCOTT',  3000),
          (20, 'FORD',   3000),
          (20, 'JONES',  2975),
          (30, 'BLAKE',  2850),
          (30, 'ALLEN',  1600),
          (30, 'WARD',   1250);

示例一:查询薪资最高的员工姓名

SELECT MAX_BY(ename, sal) FROM dept_sal;

-- 返回结果:
+------+
| _c0  |
+------+
| KING |
+------+

示例二:查询每个部门中薪资最高的员工姓名

SELECT deptno, MAX_BY(ename, sal) AS top_earner
    FROM dept_sal
    GROUP BY deptno;

-- 返回结果:
+------------+------------+
| deptno     | top_earner |
+------------+------------+
| 10         | KING       |
| 20         | SCOTT      |
| 30         | BLAKE      |
+------------+------------+

相关函数

MAX_BY函数属于聚合函数更多将多条输入记录进行求平均值、参数聚合的相关函数请参见聚合函数