カテゴリ:

集計関数 (一般)、 ウィンドウ関数 (ウィンドウフレーム)

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