Categorias:

Funções de agregação (General) , Funções de janela

MODE

Retorna o valor mais frequente para os valores dentro de expr1. Valores NULL são ignorados. Se todos os valores forem NULL, ou houver 0 linhas, então a função retorna NULL.

Sintaxe

Função de agregação

MODE( <expr1> )

Função de janela

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

Argumentos

expr1

Esta expressão produz os valores que são pesquisados para encontrar o valor mais frequente. A expressão pode ser de qualquer um dos seguintes tipos de dados:

  • BINARY

  • BOOLEAN

  • DATE

  • FLOAT

  • INTEGER

  • NUMBER

  • TIMESTAMP (TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ)

  • VARCHAR

  • VARIANT

Esta função não oferece suporte aos seguintes tipos de dados:

  • ARRAY

  • GEOGRAPHY

  • OBJECT

expr2

A expressão opcional pela qual os dados devem ser divididos em grupos. A saída contém o valor mais frequente para cada grupo/partição.

Retornos

O tipo de dados do valor retornado é idêntico ao tipo de dados da expressão de entrada.

Notas de uso

  • Se houver um empate para o valor mais frequente (dois ou mais valores ocorrem tão frequentemente quanto um ao outro, e mais frequentemente que qualquer outro valor), MODE retornará um desses valores.

  • DISTINCT não é suportado para esta função.

  • Mesmo que NULL seja o valor mais frequente, a função não retorna NULL (a menos que todos os valores sejam NULL).

  • Quando esta função é chamada como uma função de janela, ela não oferece suporte para:

    • Uma cláusula ORDER BY dentro da cláusula OVER.

    • Quadros de janela explícitos.

Exemplos

O código a seguir demonstra o uso da função MODE:

Criar uma tabela e dados:

CREATE OR REPLACE TABLE aggr (k INT, v DECIMAL(10,2));

Obtenha o valor MODE da coluna v. A função retorna NULL porque não há linhas.

SELECT MODE(v)
  FROM aggr;
+---------+
| MODE(V) |
|---------|
|    NULL |
+---------+

Inserir algumas linhas:

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

A função MODE retorna o valor 10 mais frequente:

SELECT MODE(v)
  FROM aggr;
+---------+
| MODE(V) |
|---------|
|   10.00 |
+---------+

Inserir mais algumas linhas:

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

Agora há dois valores mais frequentes. A função MODE seleciona o valor 10:

SELECT MODE(v)
  FROM aggr;
+---------+
| MODE(V) |
|---------|
|   10.00 |
+---------+

Insira uma linha com um valor NULL:

INSERT INTO aggr (k, v) VALUES (3, NULL);

Obter o valor MODE para cada grupo. Observe que, como o grupo k = 3 contém apenas valores NULL, o valor retornado para esse grupo é NULL.

SELECT k, MODE(v)
  FROM aggr
  GROUP BY k
  ORDER BY k;
+---+---------+
| K | MODE(V) |
|---+---------|
| 1 |   10.00 |
| 2 |   20.00 |
| 3 |    NULL |
+---+---------+

A função MODE também pode ser usada como uma função de janela básica com uma cláusula 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 |
+---+-------+-------------------------------+