Agregações e GROUP BY
FILTER, HAVING e agregações agrupadas. Padrões práticos de PostgreSQL para consultas de produção.
Receita
SELECT customer_id,
count(*) AS orders,
sum(total) AS revenue,
avg(total) FILTER (WHERE total > 100) AS avg_big_orders
FROM app.orders
GROUP BY customer_id
HAVING sum(total) > 500;Quando usar isso: Este padrão aparece em consultas SQL de aplicação ou relatórios que você mantém.
Exemplo Prático
SELECT date_trunc('day', created_at) AS day,
count(*) FILTER (WHERE email LIKE '%@example.com') AS corp_signups,
count(*) AS all_signups
FROM app.customers
GROUP BY 1
ORDER BY 1 DESC;O que isso demonstra:
- Clausula
FILTERconta subconjuntos semCASE HAVINGfiltra grupos após a agregaçãodate_truncagrupatimestamptzpor dia
Mergulho Profundo
Regras
- Colunas não agregadas na lista
SELECTdevem aparecer emGROUP BY(ou ser funcionalmente dependentes da chave primária no PG 9.1+). WHEREfiltra linhas antes do agrupamento;HAVINGfiltra grupos.FILTERé mais limpo queSUM(CASE WHEN ...).
Armadilhas
SELECT *em aplicações - Novas colunas quebram serializadores. Correção: Liste as colunas explicitamente.- Comparações
NULL-= NULLé sempre desconhecido. Correção: UseIS NULLouIS DISTINCT FROM. - Casts implícitos - Scans sequenciais inesperados em tipos incompatíveis. Correção: Combine os tipos do predicado com os tipos da coluna.
- Consultas ilimitadas - Falta de
LIMITem tabelas grandes. Correção: Paginar ou agregar intencionalmente. - Estatísticas desatualizadas - Planos ruins após carga em massa. Correção: Execute
ANALYZEnas tabelas afetadas.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Construtor de consultas ORM | Padrão da equipe em uma stack | SQL complexo se torna opaco |
| Visão materializada | Agregações repetitivas e caras | Necessita de estratégia de atualização |
| Réplica de Data Warehouse | Consultas pesadas de BI | Não para latência OLTP |
FAQs
Devo formatar SQL em strings de aplicação?
Use strings de template multilinhas ou arquivos SQL; use lint em CI.
Quando `DISTINCT` é suficiente?
Quando você precisa de linhas únicas sem agregações.
O `ORDER BY` prejudica os índices?
A ordenação pode usar a ordem do índice se a consulta corresponder às colunas do índice.
Relacionados
- Subconsultas e EXISTS - padrões de semi-join
- Funções de Janela - agregações não colapsantes
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, e PostGIS 3.5+.