カテゴリ:

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

MODE

式1 内の値の中で最も頻度の高い値を返します。NULL 値は無視されます。すべての値が NULLの場合、または0行がある場合、関数は NULLを返します。

構文

集計関数

MODE( <expr1> )

ウィンドウ関数

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

引数

式1

この式は、最も頻度の高い値を見つけるために検索される値を生成します。式は、次のデータ型のいずれかになります。

  • BINARY

  • BOOLEAN

  • DATE

  • FLOAT

  • INTEGER

  • NUMBER

  • TIMESTAMP (TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ)

  • VARCHAR

  • VARIANT

この関数は、次のデータ型をサポートしていません。

  • ARRAY

  • GEOGRAPHY

  • OBJECT

式2

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

戻り値

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

使用上の注意

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

  • 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, 20), 
    (1, 21);

MODE は、最も頻度の高い値10を返します。

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

さらにいくつかの行を挿入します。

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

現在、最も頻繁に使用される値は2つあります。 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 | 20.00 |                         10.00 |
| 1 | 21.00 |                         10.00 |
| 2 | 20.00 |                         20.00 |
| 2 | 25.00 |                         20.00 |
| 2 | 30.00 |                         20.00 |
| 3 |  NULL |                          NULL |
+---+-------+-------------------------------+