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
Funções de Agregação SQLExplained
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.