Skip to content

Funções de Agregação SQL explicadas

Funções de agregação SQL, GROUP BY, HAVING e agregados distintos/avançados mapeados para valores devolvidos e exemplos de uma linha sobre uma tabela orders.

As funções de agregação colapsam muitas linhas num único resultado escalar. O GROUP BY particiona as linhas por chave antes de agregar. O HAVING filtra grupos depois da agregação. As entradas NULL são ignoradas por todos os agregados exceto o COUNT(*).

Tabela de referência · 29 entradas
29 of 29 rows
Escalares
Contagem de valores de entrada não nulos; COUNT(*) conta todas as linhas.SELECT COUNT(*) FROM orders
Soma dos valores numéricos não nulos. Devolve NULL num conjunto vazio.SELECT SUM(total) FROM orders
Média aritmética dos valores numéricos não nulos. Entradas NULL ignoradas.SELECT AVG(total) FROM orders
O menor valor não nulo, em qualquer tipo comparável.SELECT MIN(total) FROM orders
O maior valor não nulo, em qualquer tipo comparável.SELECT MAX(total) FROM orders
Agrupamento
Particiona as linhas de entrada por chave; os agregados correm por partição.SELECT user_id, SUM(total) FROM orders GROUP BY user_id
Predicado avaliado por grupo depois da agregação. Substitui o WHERE para agregados.SELECT user_id, COUNT(*) FROM orders GROUP BY user_id HAVING COUNT(*) > 5
Vários agregados calculados por grupo numa só passagem.SELECT user_id, COUNT(*), SUM(total), AVG(total) FROM orders GROUP BY user_id
Calcula vários agrupamentos numa só declaração; as chaves fora do conjunto atual devolvem NULL.SELECT user_id, region, SUM(total) FROM orders GROUP BY GROUPING SETS ((user_id), (region), ())
Atalho para conjuntos de agrupamento hierárquicos; acrescenta subtotais e um total geral.SELECT region, user_id, SUM(total) FROM orders GROUP BY ROLLUP (region, user_id)
Atalho para todas as combinações das chaves listadas como conjuntos de agrupamento.SELECT region, user_id, SUM(total) FROM orders GROUP BY CUBE (region, user_id)
Mistura chaves de grupo simples com conjuntos de agrupamento numa só cláusula.SELECT user_id, region, SUM(total) FROM orders GROUP BY user_id, GROUPING SETS ((region), ())
Mantém a primeira linha por chave na ordem de ordenação. Extensão do Postgres.SELECT DISTINCT ON (user_id) user_id, total FROM orders ORDER BY user_id, created_at DESC
Distintos e avançados
Contagem de valores não nulos únicos. Deduplica primeiro.SELECT COUNT(DISTINCT user_id) FROM orders
Estima a contagem de valores distintos com erro limitado; feito para volumes grandes.SELECT APPROX_COUNT_DISTINCT(user_id) FROM orders
Concatena strings não nulas com um delimitador.SELECT STRING_AGG(user_id::text, ',') FROM orders
Concatena strings não nulas; o nome MySQL de STRING_AGG.SELECT GROUP_CONCAT(user_id SEPARATOR ',') FROM orders
Recolhe os valores de entrada não nulos num array.SELECT ARRAY_AGG(total) FROM orders
Recolhe as linhas de entrada num array JSON; a forma JSONB armazena binário analisado.SELECT JSONB_AGG(user_id) FROM orders
TRUE quando todos / qualquer valor de entrada não nulo é verdadeiro.SELECT BOOL_AND(total > 0), BOOL_OR(total > 100) FROM orders
Alias standard de BOOL_AND.SELECT EVERY(total > 0) FROM orders
Percentil interpolado / por posição exata sobre a entrada ordenada; requer WITHIN GROUP.SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total) FROM orders
O valor de entrada mais frequente; um agregado de conjunto ordenado no Postgres.SELECT MODE() WITHIN GROUP (ORDER BY total) FROM orders
Passa a ordem de ordenação a agregados de conjunto ordenado e hipotético.SELECT RANK(500) WITHIN GROUP (ORDER BY total) FROM orders
Restringe o agregado às linhas que passam a condição.SELECT COUNT(*) FILTER (WHERE total > 100) FROM orders
Ordena os valores antes de serem juntados ou recolhidos pelo agregado.SELECT STRING_AGG(user_id::text, ',' ORDER BY user_id) FROM orders
COUNT(*) e COUNT(1) contam todas as linhas; COUNT(col) ignora entradas NULL.SELECT COUNT(*), COUNT(total), COUNT(1) FROM orders
Desvio padrão amostral dos valores numéricos não nulos. STDDEV_POP dá a forma populacional; o predefinido do nome simples varia por motor.SELECT STDDEV(total) FROM orders
Variância amostral dos valores numéricos não nulos (quadrado do STDDEV). VAR_SAMP e VAR_POP nomeiam cada forma.SELECT VARIANCE(total) FROM orders