PostgreSQL FILTER
A cláusula `FILTER` no PostgreSQL é utilizada para aplicar condições às funções de agregação, permitindo um controle mais granular sobre quais linhas são incluídas na agregação. É particularmente útil para executar a agregação condicional diretamente na chamada da função de agregação.
Uso
A cláusula `FILTER` é utilizada com funções de agregação para especificar uma condição que determina quais linhas serão incluídas no cálculo. Ela é escrita imediatamente após a função de agregação, entre parênteses.
sql
SELECT aggregate_function(column) FILTER (WHERE condition)
FROM table_name;
Nessa sintaxe, `FILTER (WHERE condition)` garante que somente as linhas que atendem à condição especificada sejam consideradas pela função de agregação. As funções de agregação comuns usadas com `FILTER` incluem `SUM`, `COUNT`, `AVG`, `MIN` e `MAX`. Além disso, a cláusula `FILTER` pode ser combinada com funções de janela para consultas analíticas.
Exemplos
1. Uso básico com COUNT
sql
SELECT COUNT(*) FILTER (WHERE status = 'active') AS active_count
FROM users;
Este exemplo conta apenas as tabelas da tabela `users` em que o `status` é 'active'.
2. Usando FILTER com SUM
sql
SELECT SUM(salary) FILTER (WHERE department = 'IT') AS total_it_salary
FROM employees;
Aqui, a função `SUM` calcula o total de salários somente para os funcionários do departamento de "TI".
3. Combinação de vários agregados
sql
SELECT
COUNT(*) AS total_orders,
COUNT(order_id) FILTER (WHERE status = 'completed') AS completed_orders,
AVG(amount) FILTER (WHERE status = 'completed') AS average_completed_amount
FROM orders;
Este exemplo calcula o número total de pedidos, o número de pedidos concluídos e a quantidade média de pedidos concluídos, tudo em uma única consulta.
Dicas e práticas recomendadas
- Use para lógica condicional. Use o `FILTER` para aplicar condições diretamente às funções de agregação, simplificando consultas complexas.
- Melhore a legibilidade. Ao usar o `FILTER`, você pode evitar subconsultas aninhadas e manter uma estrutura de consulta mais limpa.
- Combinar com GROUP BY. O `FILTER` pode ser efetivamente combinado com o `GROUP BY` para agregações condicionais agrupadas. Por exemplo:
sql
SELECT department, COUNT(employee_id) FILTER (WHERE status = 'active') AS active_employees
FROM employees
GROUP BY department;
- Condições de teste separadamente. Certifique-se de que a lógica em sua cláusula `FILTER` esteja correta, testando as condições independentemente quando possível.
- Observe o desempenho em grandes conjuntos de dados. Embora o `FILTER` possa simplificar as consultas, garanta que o desempenho seja ideal, especialmente com grandes conjuntos de dados e condições complexas.
- Conformidade com o padrão SQL. A cláusula `FILTER` faz parte do padrão SQL, oferecendo benefícios de compatibilidade para consultas entre bancos de dados.
Erros e armadilhas comuns
- Mal-entendido da lógica de condições: Certifique-se de que a condição na cláusula `FILTER` esteja corretamente especificada para evitar resultados inesperados.
- Considerações sobre o desempenho: Esteja atento ao possível impacto no desempenho de grandes conjuntos de dados e otimize-os quando necessário.
Comparação entre FILTER e CASE
A cláusula `FILTER` é diferente do uso de instruções `CASE` em funções agregadas. Enquanto o `FILTER` fornece uma sintaxe mais concisa e legível para a agregação condicional, o `CASE` oferece flexibilidade para uma lógica mais complexa. Escolha `FILTER` para condições mais simples e `CASE` quando for necessária uma lógica mais detalhada.