arg_max finds the row with the highest value in one column and returns the corresponding value from another column in that row. For example, arg_max(sal, ename) returns the name of the highest-paid employee.
This function is available in MaxCompute V2.0.
Usage notes
Non-deterministic when tied: If multiple rows share the maximum value, the function returns a value from one of those rows at random. Results may differ across executions.
NULL rows are excluded: Rows where
valueToMaximizeis NULL are not included in the calculation.New data types require V2.0 data type edition: If your query uses TINYINT, SMALLINT, INT, FLOAT, VARCHAR, TIMESTAMP, or BINARY, enable the MaxCompute V2.0 data type edition before running the query:
Session level: Add
set odps.sql.type.system.odps2=true;before your SQL statement and commit them together.Project level: Run the following command as the project owner. Changes take effect after 10 to 15 minutes.
setproject odps.sql.type.system.odps2=true;For details on
setproject, see Project operations. For precautions when enabling the V2.0 data type edition at the project level, see Data type editions.
Memory overflow risk: SQL statements with multiple aggregate functions may cause memory overflow if computing resources are insufficient. Optimize the SQL statement or purchase additional computing resources as needed.
Syntax
arg_max(<valueToMaximize>, <valueToReturn>)Parameters
| Parameter | Required | Data type | Description |
|---|---|---|---|
valueToMaximize | Yes | Any | The column or value to find the maximum of. Rows where this value is NULL are excluded. If you use TINYINT, SMALLINT, INT, FLOAT, VARCHAR, TIMESTAMP, or BINARY, enable the V2.0 data type edition. See Usage notes. |
valueToReturn | Yes | Any | The column or value to return from the row with the highest valueToMaximize. |
Return value
The return type matches the type of valueToReturn. If multiple rows have the same maximum value, one result is returned at random.
Examples
The following examples use the emp table. To create the table and load the sample data, run:
create table if not exists emp
(empno bigint,
ename string,
job string,
mgr bigint,
hiredate datetime,
sal bigint,
comm bigint,
deptno bigint);
tunnel upload emp.txt emp; -- Replace emp.txt with the actual path to your data file.The emp.txt file contains the following data:
7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
7948,JACCKA,CLERK,7782,1981-04-12 00:00:00,5000,,10
7956,WELAN,CLERK,7649,1982-07-20 00:00:00,2450,,10
7956,TEBAGE,CLERK,7748,1982-12-30 00:00:00,1300,,10Example 1: Return the name of the highest-paid employee
select arg_max(sal, ename) from emp;Result:
+------------+
| _c0 |
+------------+
| KING |
+------------+Example 2: Return the highest-paid employee per department
Use GROUP BY to group employees by department and return the top earner in each group.
select deptno, arg_max(sal, ename) from emp group by deptno;Result:
+------------+------------+
| deptno | _c1 |
+------------+------------+
| 10 | KING |
| 20 | SCOTT |
| 30 | BLAKE |
+------------+------------+Example 3: NULL handling in valueToMaximize
Rows where valueToMaximize is NULL are excluded from the calculation. The following example shows a query over a dataset that includes a NULL salary. The NULL row is skipped and the function returns the result based on the remaining rows.
-- The emp table includes rows with NULL comm values.
-- arg_max ignores those rows when comm is used as valueToMaximize.
select arg_max(comm, ename) from emp;Result:
+------------+
| _c0 |
+------------+
| MARTIN |
+------------+MARTIN has the highest non-NULL commission (1400). Rows with NULL comm are excluded.
Related functions
arg_max is an aggregate function. For other aggregate functions, see Aggregate functions.