MODE¶
对于 expr1
中的值,返回出现频率最高的值。忽略 NULL 值。如果所有值都是 NULL,或者有 0 行,则函数返回 NULL。
语法¶
聚合函数
MODE( <expr1> )
窗口函数
MODE( <expr1> ) OVER ( [ PARTITION BY <expr2> ] )
实参¶
expr1
此表达式会生成搜索值以找到最常见的值。表达式可以是以下任何数据类型:
BINARY
BOOLEAN
DATE
FLOAT
INTEGER
NUMBER
TIMESTAMP(TIMESTAMP_LTZ、TIMESTAMP_NTZ、TIMESTAMP_TZ)
VARCHAR
VARIANT
此函数不支持以下数据类型:
ARRAY
GEOGRAPHY
OBJECT
expr2
用于将数据划分为组的可选表达式。输出包含每个组/分区的最常见值。
返回¶
返回值的数据类型与输入表达式的数据类型相同。
使用说明¶
如果最常见的值出现平局(两个或多个值出现的频率相同,并且比任何其他值出现的频率都高),则 MODE 返回其中一个值。
此函数不支持 DISTINCT。
即使 NULL 是最常见的值,该函数也不会返回 NULL(除非所有值都是 NULL)。
用作窗口函数时:
此函数不支持:
OVER() 子句中的 ORDER BY 分子句。选择最常见的值时,值的顺序无关紧要。
窗口框架。
示例¶
以下代码演示 MODE
的用法:
创建表和数据:
create or replace table aggr(k int, v decimal(10,2));获取列 v 的
MODE
值。该函数返回 NULL,因为没有行。select mode(v) from aggr; +---------+ | MODE(V) | |---------| | NULL | +---------+插入一些行:
INSERT INTO aggr (k, v) VALUES (1, 10), (1, 10), (1, 10), (1, 10), (1, 20), (1, 21);
MODE
返回最常见的值 10:select mode(v) from aggr; +---------+ | MODE(V) | |---------| | 10.00 | +---------+再插入几行:
INSERT INTO aggr (k, v) VALUES (2, 20), (2, 20), (2, 25), (2, 30);现在有两个最常见的值。
MODE
选择值 10:select mode(v) from aggr; +---------+ | MODE(V) | |---------| | 10.00 | +---------+插入包含 NULL 值的一行:
INSERT INTO aggr (k, v) VALUES (3, null);获取每个组的
MODE
值。请注意,由于组 k = 3 中的值仅包含 NULL 值,因此该组的返回值为 NULL。select k, mode(v) from aggr group by k order by k; +---+---------+ | K | MODE(V) | |---+---------| | 1 | 10.00 | | 2 | 20.00 | | 3 | NULL | +---+---------+
MODE
也可以用作带 OVER() 子句的基本窗口函数:select k, v, mode(v) over (partition by k) from aggr order by k, v; +---+-------+-------------------------------+ | K | V | MODE(V) OVER (PARTITION BY K) | |---+-------+-------------------------------| | 1 | 10.00 | 10.00 | | 1 | 10.00 | 10.00 | | 1 | 10.00 | 10.00 | | 1 | 10.00 | 10.00 | | 1 | 20.00 | 10.00 | | 1 | 21.00 | 10.00 | | 2 | 20.00 | 20.00 | | 2 | 20.00 | 20.00 | | 2 | 25.00 | 20.00 | | 2 | 30.00 | 20.00 | | 3 | NULL | NULL | +---+-------+-------------------------------+