- 类别:
/sql-reference/functions-aggregation`(通用)、:doc:/sql-reference/functions-analytic`(窗口框架)
MAX¶
返回 expr
中的记录的最大值。忽略 NULL 值,除非所有记录均为 NULL,在这种情况下,返回 NULL 值。
语法¶
聚合函数
MAX( <expr> )
窗口函数
MAX( <expr> ) [ OVER ( [ PARTITION BY <expr1> ] [ ORDER BY <expr2> [ <window_frame> ] ] ) ]
有关 window_frame
语法的详细信息,请参阅 窗口框架语法和用法。
返回¶
返回值的数据类型与输入值的数据类型相同。
使用说明¶
为了与其他系统兼容,您可以将 DISTINCT 关键字指定为函数的实参,但该关键字没有任何作用。
如果该函数作为窗口函数被调用,则窗口可以包含可选的
window_frame
。window_frame`(累积或滑动)指定窗口内返回求和值的行的子集。如果未指定 :samp:`window_frame
,则默认为以下累积窗口框架(遵循窗口函数的 ANSI 标准):RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
有关窗口框架的更多详细信息(包括语法和示例),请参阅 窗口框架语法和用法。
排序规则详细信息¶
The comparisons follow the collation based on the input arguments' collations and precedences.
The collation of the result is the same as the collation of the input.
示例¶
以下示例演示了如何使用 MAX 函数。
创建表和数据:
CREATE OR REPLACE TABLE sample_table(k CHAR(4), d CHAR(4)); INSERT INTO sample_table VALUES ('1', '1'), ('1', '5'), ('1', '3'), ('2', '2'), ('2', NULL), ('3', NULL), (NULL, '7'), (NULL, '1');显示数据:
SELECT k, d FROM sample_table ORDER BY k, d;+------+------+ | K | D | |------+------| | 1 | 1 | | 1 | 3 | | 1 | 5 | | 2 | 2 | | 2 | NULL | | 3 | NULL | | NULL | 1 | | NULL | 7 | +------+------+使用 MAX 函数来检索名为
d
的列中的最大值:SELECT MAX(d) FROM sample_table;+--------+ | MAX(D) | |--------| | 7 | +--------+将 GROUP BY 子句与 MAX 函数结合使用,以检索每个组中的最大值(其中每个组基于列
k
的值):SELECT k, MAX(d) FROM sample_table GROUP BY k ORDER BY k;+------+--------+ | K | MAX(D) | |------+--------| | 1 | 5 | | 2 | 2 | | 3 | NULL | | NULL | 7 | +------+--------+使用 PARTITION BY 子句,根据
k
的值将数据分成几组。此用法类似于使用 GROUP BY,但不完全相同。特别是,GROUP BY 为每组生成一个输出行,而 PARTITION BY 为每个输入行生成一个输出行。SELECT k, d, MAX(d) OVER (PARTITION BY k) FROM sample_table ORDER BY k, d;+------+------+------------------------------+ | K | D | MAX(D) OVER (PARTITION BY K) | |------+------+------------------------------| | 1 | 1 | 5 | | 1 | 3 | 5 | | 1 | 5 | 5 | | 2 | 2 | 2 | | 2 | NULL | 2 | | 3 | NULL | NULL | | NULL | 1 | 7 | | NULL | 7 | 7 | +------+------+------------------------------+使用窗口 ORDER BY 子句创建两行宽的滑动窗口,并输出该窗口内的最大值。(请记住,窗口子句中的 ORDER BY 不同于语句级别的 ORDER BY。)此示例使用单个分区,因此 OVER() 子句中没有 PARTITION BY 子句。
SELECT k, d, MAX(d) OVER (ORDER BY k, d ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) FROM sample_table ORDER BY k, d;+------+------+----------------------------------------------------------------------+ | K | D | MAX(D) OVER (ORDER BY K, D ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) | |------+------+----------------------------------------------------------------------| | 1 | 1 | 1 | | 1 | 3 | 3 | | 1 | 5 | 5 | | 2 | 2 | 5 | | 2 | NULL | 2 | | 3 | NULL | NULL | | NULL | 1 | 1 | | NULL | 7 | 7 | +------+------+----------------------------------------------------------------------+