カテゴリ:

集計関数 (General) , ウィンドウ関数

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

データをグループに分割するオプションの式です。出力には、各グループ/パーティションの最も頻度の高い値が含まれます。

戻り値

返される値のデータ型は、入力式のデータ型と同じです。

使用上の注意

  • 最も頻度の高い値が同じ値である場合(2つ以上の値が互いに同じ頻度で、他の値よりも頻繁に発生する場合)、 MODE はそれらの値の1つを返します。

  • 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

これで最も頻繁に使用される値は2つになりました。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