类别:

/sql-reference/functions-aggregation`(通用)、:doc:/sql-reference/functions-analytic`(窗口框架)

MAX

返回 expr 中的记录的最大值。忽略 NULL 值,除非所有记录均为 NULL,在这种情况下,返回 NULL 值。

另请参阅:

COUNTSUMMIN

语法

聚合函数

MAX( <expr> )
Copy

窗口函数

MAX( <expr> ) [ OVER ( [ PARTITION BY <expr1> ] [ ORDER BY <expr2> [ <window_frame> ] ] ) ]
Copy

有关 window_frame 语法的详细信息,请参阅 窗口框架语法和用法

返回

返回值的数据类型与输入值的数据类型相同。

使用说明

  • 为了与其他系统兼容,您可以将 DISTINCT 关键字指定为函数的实参,但该关键字没有任何作用。

  • 如果该函数作为窗口函数被调用,则窗口可以包含可选的 window_framewindow_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');
Copy

显示数据:

SELECT k, d
    FROM sample_table
    ORDER BY k, d;
Copy
+------+------+
| 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;
Copy
+--------+                                                                      
| MAX(D) |
|--------|
| 7      |
+--------+

将 GROUP BY 子句与 MAX 函数结合使用,以检索每个组中的最大值(其中每个组基于列 k 的值):

SELECT k, MAX(d)
  FROM sample_table 
  GROUP BY k
  ORDER BY k;
Copy
+------+--------+                                                               
| 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;
Copy
+------+------+------------------------------+                                  
| 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;
Copy
+------+------+----------------------------------------------------------------------+
| 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                                                                    |
+------+------+----------------------------------------------------------------------+
语言: 中文