Returns the maximum value in a column or within a window. NULL values are ignored in the calculation.
MAX is both an aggregate function and a window function.
Syntax
-- Aggregate: maximum value of a column
max(<colname>)
-- Window: maximum value of an expression within a window
max(<expr>) over([partition_clause] [orderby_clause] [frame_clause])
Parameters
| Parameter | Required | Description |
|---|---|---|
colname |
Yes | The column to evaluate. Accepts any data type except BOOLEAN. NULL rows are excluded from the result. |
expr |
Yes | The expression to evaluate in window mode. Accepts any data type except BOOLEAN. NULL rows are excluded from the result. |
partition_clause, orderby_clause, frame_clause |
No | Window definition clauses. For details, see windowing_definition. |
Return value
-
In aggregate mode: returns the same data type as
colname. -
In window mode: returns the same data type as
expr.
Limitations
Window functions have the following limitations:
-
Window functions are supported only in
SELECTstatements. -
A window function cannot contain nested window functions or nested aggregate functions.
-
Window functions and aggregate functions of the same level cannot appear in the same query.
Sample data
The examples in this topic use a table named emp. Run the following statements to create the table and load the sample data:
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;
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,,10
Examples
Example 1: Aggregate maximum across all rows
Return the highest salary across all employees:
select max(sal) from emp;
Result:
+------------+
| _c0 |
+------------+
| 5000 |
+------------+
Example 2: Aggregate maximum with GROUP BY
Group employees by department and return the highest salary in each department:
select deptno, max(sal) from emp group by deptno;
Result:
+------------+------------+
| deptno | _c1 |
+------------+------------+
| 10 | 5000 |
| 20 | 3000 |
| 30 | 2850 |
+------------+------------+
Example 3: Window maximum without ORDER BY
Partition rows by deptno and return the maximum salary within each partition. Because no ORDER BY clause is specified, every row in the same partition gets the same result — the maximum salary for that entire department.
Unlike GROUP BY, which produces one output row per group, PARTITION BY produces one output row per input row.
select deptno, sal, max(sal) over (partition by deptno) from emp;
Result:
+------------+------------+------------+
| deptno | sal | _c2 |
+------------+------------+------------+
| 10 | 1300 | 5000 | -- Maximum of the entire partition (deptno=10)
| 10 | 2450 | 5000 |
| 10 | 5000 | 5000 |
| 10 | 1300 | 5000 |
| 10 | 5000 | 5000 |
| 10 | 2450 | 5000 |
| 20 | 3000 | 3000 |
| 20 | 3000 | 3000 |
| 20 | 800 | 3000 |
| 20 | 1100 | 3000 |
| 20 | 2975 | 3000 |
| 30 | 1500 | 2850 |
| 30 | 950 | 2850 |
| 30 | 1600 | 2850 |
| 30 | 1250 | 2850 |
| 30 | 1250 | 2850 |
| 30 | 2850 | 2850 |
+------------+------------+------------+
Example 4: Window running maximum with ORDER BY
Add ORDER BY to compute a running maximum — the highest salary seen from the first row of the partition up to the current row.
select deptno, sal, max(sal) over (partition by deptno order by sal) from emp;
Result:
+------------+------------+------------+
| deptno | sal | _c2 |
+------------+------------+------------+
| 10 | 1300 | 1300 | -- First row of the partition; running max = 1300
| 10 | 1300 | 1300 |
| 10 | 2450 | 2450 | -- Running max grows to 2450
| 10 | 2450 | 2450 |
| 10 | 5000 | 5000 |
| 10 | 5000 | 5000 |
| 20 | 800 | 800 |
| 20 | 1100 | 1100 |
| 20 | 2975 | 2975 |
| 20 | 3000 | 3000 |
| 20 | 3000 | 3000 |
| 30 | 950 | 950 |
| 30 | 1250 | 1250 |
| 30 | 1250 | 1250 |
| 30 | 1500 | 1500 |
| 30 | 1600 | 1600 |
| 30 | 2850 | 2850 |
+------------+------------+------------+
Related functions
MAX is an aggregate function and a window function.
-
For other aggregate functions such as SUM, AVG, and COUNT, see Aggregate functions.
-
For window function syntax and other window functions, see Window functions.