类别:

聚合函数 (通用)、 窗口函数 (窗口框架)

MODE

对于 expr1 中的值,返回出现频率最高的值。忽略 NULL 值。如果所有值都是 NULL,或者有 0 行,则函数返回 NULL。

语法

聚合函数

MODE( <expr1> )
Copy

窗口函数

MODE( <expr1> ) OVER ( [ PARTITION BY <expr2> ] )
Copy

实参

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));
Copy

获取列 v 的 MODE 值。该函数返回 NULL,因为没有行。

select mode(v) from aggr;
+---------+
| MODE(V) |
|---------|
|    NULL |
+---------+
Copy

插入一些行:

INSERT INTO aggr (k, v) VALUES
    (1, 10), 
    (1, 10), 
    (1, 10), 
    (1, 10), 
    (1, 20), 
    (1, 21);
Copy

MODE 返回最常见的值 10:

select mode(v) from aggr;
+---------+
| MODE(V) |
|---------|
|   10.00 |
+---------+
Copy

再插入几行:

INSERT INTO aggr (k, v) VALUES
    (2, 20), 
    (2, 20), 
    (2, 25), 
    (2, 30);
Copy

现在有两个最常见的值。MODE 选择值 10:

select mode(v) from aggr;
+---------+
| MODE(V) |
|---------|
|   10.00 |
+---------+
Copy

插入包含 NULL 值的一行:

INSERT INTO aggr (k, v) VALUES (3, null);
Copy

获取每个组的 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 |
+---+---------+
Copy

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 |
+---+-------+-------------------------------+
Copy
语言: 中文