Categorias:

Funções de agregação (Geral) , Funções de janela (Quadro 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> )
Copy

Função de janela

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

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 usado como uma função de janela:

    • Esta função não oferece suporte para:

      • Subcláusula ORDER BY na cláusula OVER(). A ordem dos valores não importa na escolha do valor mais frequente.

      • Quadros de janela.

Exemplos

O código a seguir demonstra o uso de MODE:

Criar uma tabela e dados:

create or replace table aggr(k int, v decimal(10,2));
Copy

Obter o valor MODE para a coluna v. A função retorna NULL porque não há linhas.

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

Inserir algumas linhas:

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

MODE retorna o valor mais frequente 10:

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

Inserir mais algumas linhas:

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

Agora existem dois valores mais frequentes. MODE seleciona o valor 10:

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

Inserir uma linha com valor NULL:

INSERT INTO aggr (k, v) VALUES (3, null);
Copy

Obter o valor MODE para cada grupo. Observe que como os valores no grupo k = 3 contêm apenas valores NULL, o valor retornado para aquele grupo será 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 também pode ser usada como uma função básica de janela 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 |
+---+-------+-------------------------------+
Copy