Volver a la lista de artículos Artículos
Lectura de 4 minutos

Cómo Utilizar Funciones Agregadas en la Cláusula WHERE

Filtrar los datos según el resultado de una función agregada es una tarea común de análisis de datos. Entonces, ¿cómo se utilizan los agregados en la cláusula WHERE de la cláusula WHERE? Dedicaremos todo este artículo a responder a esa pregunta.

La combinación de funciones agregadas y el filtrado basado en sus resultados se utiliza a menudo en el análisis de datos, por ejemplo, mostrando las sucursales con ventas totales superiores a X, los países en los que el número de puestos es inferior a Y, los estudiantes con una puntuación media inferior a Z, etc.

Los usuarios más recientes de SQL suelen intentar hacer este tipo de filtrado en la cláusula WHERE. Pero como veremos en este artículo, esa no es una solución viable.

Así que vamos a ver cómo puede obtener los resultados que necesita. Primero, sin embargo, echaremos un vistazo a nuestro conjunto de datos. En este caso, el ejemplo se basa en los datos del European Climate Assessment & Dataset.

Ejemplo de datos

Nuestro conjunto de datos consta de una sola tabla: temperature_data. En ella se almacena información sobre la temperatura máxima diaria registrada en varias ciudades. Las columnas son:

  • id - El ID de la temperatura registrada.
  • city - La ciudad donde se registró la temperatura.
  • date - La fecha en que se registró la temperatura.
  • temperature - La temperatura más alta registrada (en grados Celsius).

Para ser más gráfico, aquí están todos los datos de la tabla.

idcitydatetemperature
1Szczecin2022-05-3118.60
2Szczecin2022-05-3017.20
3Szczecin2022-05-2916.40
4Szczecin2022-05-2814.70
5Szczecin2022-05-2717.00
6Rotterdam2022-05-3118.40
7Rotterdam2022-05-3014.50
8Rotterdam2022-05-2914.50
9Rotterdam2022-05-2815.80
10Rotterdam2022-05-2716.10
11Berlin2022-05-3121.00
12Berlin2022-05-3017.50
13Berlin2022-05-2915.20
14Berlin2022-05-2816.30
15Berlin2022-05-2718.50

¿Una función agregada en la cláusula WHERE?

Lo que quiero hacer con estos datos es encontrar la temperatura media más alta por ciudad y mostrar sólo las ciudades con una media superior a 16°C.

Los nuevos analistas podrían escribir la consulta utilizando la función de agregación AVG() en la cláusula WHERE:

SELECT city,
	 AVG(temperature) AS average_max_temperature
FROM temperature_data
WHERE AVG(temperature) > 16
GROUP BY city;

En primer lugar, buscamos la temperatura media más alta por ciudad. A continuación, utilizamos este resultado en la cláusula WHERE; esto parece correcto. Pero esta consulta arroja un error.

Cómo utilizar funciones agregadas en la cláusula WHERE

Y este error responde muy explícitamente a la pregunta de cómo se utilizan las funciones de agregación en la cláusula WHERE: ¡no se hace!

Las funciones de agregación no están permitidas porque la cláusula WHERE se utiliza para filtrar los datos antes de la agregación. Así que, aunque WHERE no sirve para agregar, tiene otros usos.

Para filtrar datos basados en el resultado de una función agregada, debe utilizar la cláusula HAVING cláusula.

Uso de funciones agregadas en la cláusula HAVING

Es sencillo arreglar la consulta anterior: sólo hay que sustituir WHERE por HAVING. La cláusula HAVING se utiliza para filtrar datos, al igual que WHERE. La principal diferencia entre WHERE y HAVING es que HAVING filtra los datos después de la agregación. Así que cuando escribas el código, tienes que asegurarte de que la cláusula HAVING viene después de la GROUP BY. Esto tiene algo que ver con el orden de las operaciones en SQL.

Reescribamos nuestra consulta anterior, eliminando WHERE y añadiendo HAVING (después de GROUP BY, por supuesto):

SELECT city,
	 AVG(temperature) AS average_highest_daily_temperature
FROM temperature_data
GROUP BY city
HAVING AVG(temperature) > 16;

Una vez más, estamos seleccionando la ciudad y encontrando la temperatura media utilizando la función AVG(). Ahora, sin embargo, los datos se agrupan por ciudad y se filtran utilizando la cláusula HAVING para mostrar sólo las medias superiores a 16.

cityaverage_highest_daily_temperature
Szczecin16.78
Berlin17.70

De los datos originales, las ciudades de Szczecin y Berlín permanecen porque su temperatura media diaria más alta es superior a 16°C.

Las funciones agregadas y el filtrado van de la mano, pero no en la cláusula WHERE

Saber que no se pueden utilizar las funciones agregadas en la cláusula WHERE es sólo la mitad de la respuesta. Por supuesto, todavía necesita alguna manera de filtrar usando la salida de las funciones agregadas. La cláusula HAVING es esa manera.

Ambas cláusulas se parecen bastante, especialmente porque la forma de establecer una condición es la misma. Sin embargo, lo importante aquí es saber que las funciones agregadas pueden utilizarse en HAVING, pero no en WHERE.

Para que esta diferencia te resulte natural, tendrás que escribir mucho código. Y para eso, necesitarás muchos ejemplos, que es exactamente de lo que trata nuestro Ejercicio de SQL curso.