- 类别:
/sql-reference/functions-aggregation`(通用)、:doc:/sql-reference/functions-window`
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 |
+---+-------+-------------------------------+