Categorias:

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

AVG

Retorna a média dos registros que não são NULL. Se todos os registros dentro de um grupo forem NULL, a função retorna NULL.

Sintaxe

Função de agregação

AVG( [ DISTINCT ] <expr1> )
Copy

Função de janela

AVG( [ DISTINCT ] <expr1> ) OVER (
                                 [ PARTITION BY <expr2> ]
                                 [ ORDER BY <expr3> [ ASC | DESC ] [ <window_frame> ] ]
                                 )
Copy

Para obter mais detalhes sobre a sintaxe window_frame, consulte Sintaxe e utilização do quadro de janela.

Argumentos

expr1

Esta é uma expressão que é avaliada como um tipo de dados numérico (INTEGER, FLOAT, DECIMAL etc.).

expr2

Esta é a expressão opcional para divisão.

expr3

Esta é a expressão opcional a ordenar dentro de cada partição.

Notas de uso

  • Ao passar uma expressão VARCHAR, esta função converte implicitamente a entrada em valores de ponto flutuante. Se a conversão não puder ser executada, um erro é devolvido.

  • Quando esta função é chamada como uma função de janela (ou seja, com uma cláusula OVER):

    • Se a cláusula OVER contiver uma subcláusula ORDER BY, então:

      • O quadro de janela é exigido. Se nenhum quadro de janela for especificado explicitamente, então o ORDER BY implicará um quadro de janela cumulativo:

        RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

        Para obter mais informações sobre quadros de janelas, incluindo sintaxe e exemplos, consulte Sintaxe e utilização do quadro de janela.

        Para obter mais informações sobre quadros de janelas implícitos, consulte também Notas de uso dos quadros de janela.

      • O uso da palavra-chave DISTINCT dentro da função de janela é proibido e resulta em um erro de tempo de compilação.

Exemplos

Configuração:

CREATE OR REPLACE TABLE avg_example(int_col int, d decimal(10,5), s1 varchar(10), s2 varchar(10));
INSERT INTO avg_example VALUES
    (1, 1.1, '1.1','one'), 
    (1, 10, '10','ten'),
    (2, 2.4, '2.4','two'), 
    (2, NULL, NULL, 'NULL'),
    (3, NULL, NULL, 'NULL'),
    (NULL, 9.9, '9.9','nine');
Copy

Exibir os dados:

SELECT * 
    FROM avg_example 
    ORDER BY int_col, d;
+---------+----------+------+------+
| INT_COL |        D | S1   | S2   |
|---------+----------+------+------|
|       1 |  1.10000 | 1.1  | one  |
|       1 | 10.00000 | 10   | ten  |
|       2 |  2.40000 | 2.4  | two  |
|       2 |     NULL | NULL | NULL |
|       3 |     NULL | NULL | NULL |
|    NULL |  9.90000 | 9.9  | nine |
+---------+----------+------+------+
Copy

Calcular a média das colunas que são numéricas ou que podem ser convertidas em números:

SELECT AVG(int_col), AVG(d)
    FROM avg_example;
+--------------+---------------+
| AVG(INT_COL) |        AVG(D) |
|--------------+---------------|
|     1.800000 | 5.85000000000 |
+--------------+---------------+
Copy

Combinar AVG com GROUP BY para calcular as médias dos diferentes grupos:

SELECT int_col, AVG(d), AVG(s1) 
    FROM avg_example 
    GROUP BY int_col
    ORDER BY int_col;
+---------+---------------+---------+
| INT_COL |        AVG(D) | AVG(S1) |
|---------+---------------+---------|
|       1 | 5.55000000000 |    5.55 |
|       2 | 2.40000000000 |    2.4  |
|       3 |          NULL |    NULL |
|    NULL | 9.90000000000 |    9.9  |
+---------+---------------+---------+
Copy

Usar como uma função de janela simples:

SELECT 
       int_col,
       AVG(int_col) OVER(PARTITION BY int_col) 
    FROM avg_example
    ORDER BY int_col;
+---------+-----------------------------------------+
| INT_COL | AVG(INT_COL) OVER(PARTITION BY INT_COL) |
|---------+-----------------------------------------|
|       1 |                                   1.000 |
|       1 |                                   1.000 |
|       2 |                                   2.000 |
|       2 |                                   2.000 |
|       3 |                                   3.000 |
|    NULL |                                    NULL |
+---------+-----------------------------------------+
Copy