カテゴリ:

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

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

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

戻り値

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

使用上の注意

  • 最も頻度の高い値が同じ値である場合(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, 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);

これで最も頻繁に使用される値は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 | 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 |
+---+-------+-------------------------------+