Voltar para a lista de artigos Artigos
4 minutos de leitura

Como usar as funções agregadas na cláusula WHERE

Filtrar dados de acordo com o resultado de uma função agregada é uma tarefa comum de análise de dados. Então, como você usa agregados na função ONDE cláusula? Vamos dedicar todo este artigo para responder a essa pergunta.

A combinação de funções agregadas e filtragem baseada em seus resultados é freqüentemente utilizada na análise de dados - por exemplo, mostrando filiais com vendas totais acima de X, países onde o número de postos é inferior a Y, estudantes com uma pontuação média abaixo de Z, e assim por diante.

Usuários mais novos de SQL muitas vezes tentam fazer tal filtragem na cláusula WHERE. Mas, como veremos neste artigo, essa não é uma solução viável.

Portanto, vamos ver como você pode obter os resultados de que precisa. Primeiro, porém, vamos dar uma olhada em nosso conjunto de dados. Neste caso, o exemplo se baseia em dados do conjunto de dados e avaliações climáticas da Europa.

Dados de exemplo

Nosso conjunto de dados consiste em apenas uma tabela: temperature_data. Ele armazena informações sobre a temperatura máxima diária registrada em várias cidades. As colunas são:

  • id - A identificação da temperatura registrada.
  • city - A cidade onde a temperatura foi registrada.
  • date - A data em que a temperatura foi registrada.
  • temperature - A temperatura mais alta registrada (em graus Celsius).

Para ser mais gráfico, aqui estão todos os dados da tabela.

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

Uma função agregada na cláusula WHERE?

O que eu quero fazer com estes dados é encontrar a temperatura média mais alta por cidade e mostrar somente as cidades com uma média acima de 16°C.

Novos analistas poderão escrever a consulta usando a função agregada AVG() na cláusula WHERE:

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

Primeiro, estamos encontrando a temperatura média mais alta por cidade. Depois, estamos usando este resultado na cláusula WHERE; isso parece estar certo. Mas esta consulta lança um erro!

Como usar as funções agregadas na cláusula WHERE

E este erro responde muito explicitamente à questão de como você usa as funções agregadas na cláusula WHERE: você não usa!

As funções agregadas não são permitidas porque o WHERE é usada para filtrar os dados antes da agregação. Portanto, embora WHERE não seja para agregação, tem outros usos.

Para filtrar dados com base em um resultado de função agregada, você deve usar a HAVING cláusula.

Usar Funções Agregadas na Cláusula HAVING

É simples consertar a consulta acima: você só precisa substituir WHERE por HAVING. A cláusula HAVING é usada para filtrar dados, muito parecida com WHERE. A principal diferença entre WHERE e HAVING é que HAVING filtra os dados após a agregação. Portanto, ao escrever o código, você tem que ter certeza de que a cláusula HAVING vem após o GROUP BY. Isto tem algo a ver com a ordem das operações em SQL.

Vamos reescrever nossa consulta anterior, removendo WHERE e acrescentando HAVING (depois de GROUP BY, é claro!):

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

Mais uma vez, estamos selecionando a cidade e encontrando a temperatura média usando a função AVG(). Agora, porém, os dados são agrupados por cidade e filtrados usando a cláusula HAVING para mostrar apenas médias acima de 16.

cityaverage_highest_daily_temperature
Szczecin16.78
Berlin17.70

A partir dos dados originais, as cidades de Szczecin e Berlim permanecem porque sua temperatura média diária mais alta está acima de 16°C.

Funções Agregadas e Filtragem Vão de mãos dadas, mas não na Cláusula WHERE

Saber que você não pode usar as funções agregadas na cláusula WHERE é apenas a metade da resposta. Naturalmente, você ainda precisa de alguma maneira de filtrar usando a saída das funções agregadas. A cláusula HAVING é assim!

Ambas as cláusulas parecem bastante semelhantes, especialmente porque a forma como você configura uma condição é a mesma. Entretanto, o importante aqui é saber que as funções agregadas podem ser usadas no HAVING, mas não no WHERE.

Para que esta diferença chegue até você naturalmente, você precisará escrever muito código. E para isso, você precisará de muitos exemplos, que é exatamente o que nosso Trilha de Práticas em SQL curso é tudo sobre.