- 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> )
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 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));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 | +---------+Inserir algumas linhas:
INSERT INTO aggr (k, v) VALUES (1, 10), (1, 10), (1, 10), (1, 10), (1, 20), (1, 21);
MODE
retorna o valor mais frequente 10: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 existem dois valores mais frequentes.
MODE
seleciona o valor 10:select mode(v) from aggr; +---------+ | MODE(V) | |---------| | 10.00 | +---------+Inserir uma linha com valor NULL:
INSERT INTO aggr (k, v) VALUES (3, null);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 | +---+---------+
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 | +---+-------+-------------------------------+