FILTRO PostgreSQL
La cláusula `FILTER` de PostgreSQL se utiliza para aplicar condiciones a las funciones de agregación, lo que permite un control más granular sobre qué filas se incluyen en la agregación. Es especialmente útil para realizar la agregación condicional directamente dentro de la llamada a la función de agregación.
Utilización
La cláusula `FILTRO` se utiliza con funciones de agregado para especificar una condición que determine qué filas se incluyen en el cálculo. Se escribe inmediatamente después de la función agregada, entre paréntesis.
sql
SELECT aggregate_function(column) FILTER (WHERE condition)
FROM table_name;
En esta sintaxis, `FILTER (WHERE condition)` garantiza que sólo las filas que cumplan la condición especificada sean consideradas por la función de agregado. Entre las funciones agregadas habituales que se utilizan con `FILTER` están `SUM`, `COUNT`, `AVG`, `MIN` y `MAX`. Además, la cláusula `FILTER` puede combinarse con funciones de ventana para consultas analíticas.
Ejemplos
1. Uso básico con COUNT
sql
SELECT COUNT(*) FILTER (WHERE status = 'active') AS active_count
FROM users;
Este ejemplo cuenta sólo las filas de la tabla "usuarios" en las que el "estado" es "activo".
2. Utilizar FILTRO con SUMA
sql
SELECT SUM(salary) FILTER (WHERE department = 'IT') AS total_it_salary
FROM employees;
Aquí, la función "SUMA" calcula los salarios totales sólo de los empleados del departamento de "TI".
3. Combinar varios 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 ejemplo calcula el número total de pedidos, el número de pedidos completados y el importe medio de los pedidos completados, todo en una sola consulta.
Consejos y buenas prácticas
- Utilízalo para la lógica condicional. Utiliza el `FILTRO` para aplicar condiciones directamente a las funciones agregadas, simplificando las consultas complejas.
- Mejora la legibilidad. Utilizando `FILTRO`, puedes evitar las subconsultas anidadas y mantener una estructura de consulta más limpia.
- Combinar con GROUP BY. El `FILTRO` puede combinarse eficazmente con el `GRUPO POR` para realizar agregaciones condicionales agrupadas. Por ejemplo:
sql
SELECT department, COUNT(employee_id) FILTER (WHERE status = 'active') AS active_employees
FROM employees
GROUP BY department;
- Prueba las condiciones por separado. Asegúrate de que la lógica de tu cláusula `FILTER` es correcta probando las condiciones de forma independiente siempre que sea posible.
- Observa el rendimiento en grandes conjuntos de datos. Aunque `FILTRO` puede simplificar las consultas, garantiza un rendimiento óptimo, especialmente con grandes conjuntos de datos y condiciones complejas.
- Cumplimiento de la norma SQL. La cláusula `FILTER` forma parte del estándar SQL, y ofrece ventajas de compatibilidad para las consultas entre bases de datos.
Errores y trampas comunes
- Condición Lógica Malentendido: Asegúrate de que la condición de la cláusula `FILTER` está correctamente especificada para evitar resultados inesperados.
- Consideraciones sobre el rendimiento: Ten en cuenta el posible impacto en el rendimiento de los grandes conjuntos de datos, y optimízalos cuando sea necesario.
Comparar FILTRO con CASO
La cláusula `FILTER` difiere del uso de las sentencias `CASE` dentro de las funciones agregadas. Mientras que `FILTER` proporciona una sintaxis más concisa y legible para la agregación condicional, `CASE` ofrece flexibilidad para una lógica más compleja. Elige `FILTRO` para condiciones más sencillas y `CASE` cuando se requiera una lógica más detallada.