Pular para o conteúdo principal

Snowflake QUALIFY para iniciantes: O que é e como usá-lo

Este guia desmistifica a cláusula QUALIFY do Snowflake, mostrando a você como simplificar as consultas SQL filtrando funções de janela sem subconsultas - perfeito para análises mais limpas e rápidas.
Atualizado 30 de mai. de 2025

Como um profissional de dados que trabalha com o Snowflake, você pode precisar filtrar os resultados da consulta com base em funções de janela. Tradicionalmente, isso requer subconsultas ou lógica de filtragem complexa. No entanto, o Snowflake oferece uma alternativa poderosa: a cláusula QUALIFY

Neste guia, explicarei como você pode usar o QUALIFY para otimizar a filtragem, com exemplos passo a passo e práticas recomendadas.

O que é a cláusula QUALIFY no Snowflake?

A cláusula QUALIFY no Snowflake é usada para filtrar resultados com funções de janela. Você pode definir funções de janela como parte da lista SELECT ou fazer referência a elas diretamente na cláusula QUALIFY.

Normalmente, o WHERE filtra as linhas brutas antes da agregação, enquanto o HAVING filtra após uma agregação do GROUP BY.

Em vez disso, o QUALIFY permite filtrar os resultados de instruções SQL como ROW_NUMBER(), RANK() e DENSE_RANK(). Isso significa que podemos utilizá-lo em nossas funções de janela para saídas e filtrá-las imediatamente.

Você pode pensar em QUALIFY como fazendo para as funções de janela o que HAVING faz para os agregados - filtrando o resultado depois que ele foi calculado.

Há vários casos de uso em que a cláusula QUALIFY se mostra particularmente útil: 

  • Você precisa filtrar os resultados da consulta com base nas saídas da função de janela.
  • Você deseja simplificar suas consultas SQL, reduzindo a necessidade de subconsultas.
  • Você precisa classificar, desduplicar ou segmentar os dados com eficiência nas partições.
  • Você está preparando um relatório ou painel que requer os registros de melhor desempenho por categoria.

> Se você é novo no Snowflake, nosso curso de Introdução ao Snowflake oferece um ponto de partida prático antes de mergulhar em cláusulas como QUALIFY. Você também pode explorar os recursos mais amplos do Snowflake com este tutorial para iniciantes.

Sintaxe de QUALIFY em Snowflake

Vamos revisar a sintaxe básica do QUALIFY para que você entenda suas partes. Veja como pode ser uma consulta simples usando QUALIFY:

SELECT
 column1,
 column2, 
 window_function() OVER (PARTITION BY column3 ORDER BY column4) AS rank
FROM table_name
QUALIFY window_function_condition;

Você tem a cláusula SELECT usual seguida de algumas colunas. Em seguida, você escreve window_function() no formato usual para obter uma coluna chamada rank.

Há a declaração usual FROM, que nos informa a tabela e, finalmente, nosso QUALIFY. Esse QUALIFY é seguido pela "window_function_condition", que geralmente é uma igualdade e pode ser algo como QUALIFY rank = 1

Observação: Você pode fazer referência ao alias de uma função de janela ou reescrever toda a expressão da função de janela dentro da cláusula QUALIFY. Ambas as abordagens funcionam.

> Se você precisar de uma revisão das funções de janela, dê uma olhada nesta folha de dicas sobre funções de janela

Exemplos de uso do QUALIFY no Snowflake

Agora que você conhece a estrutura geral do QUALIFY, mostrarei alguns exemplos específicos usando essa cláusula.

Exemplo 1: Filtragem das N primeiras linhas por grupo

Suponhamos que você queira encontrar os três funcionários mais bem pagos de cada departamento. Primeiro, vamos dar uma olhada em um exemplo que não usa QUALIFY, seguido de uma versão mais concisa que usa.

/* First we have to rank all the employees */
WITH ranked_employees AS (
SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees)

/* Then we query to subquery and filter using WHERE */
SELECT *
FROM ranked_employees
WHERE rank <= 3;

Como você pode ver, o exemplo acima requer um CTE, mas com QUALIFY, a consulta é mais simples:

SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank <= 3;

A consulta acima atribui uma classificação a cada funcionário em seu departamento e retorna os três primeiros em cada departamento. Ele usa a instrução QUALIFY para filtrar imediatamente sem a necessidade de uma subconsulta ou CTE. Isso é especialmente útil em painéis ou APIs em que é importante minimizar o comprimento da consulta e o tempo de resposta.

Exemplo 2: Filtragem de registros duplicados

Se uma tabela tiver registros duplicados e quisermos manter apenas a primeira ocorrência com base em uma função de classificação, poderemos usar QUALIFY com ROW_NUMBER():

SELECT 
order_id, 
customer_id, 
order_date,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS row_num
FROM orders
QUALIFY row_num = 1;

A coluna row_num é gerada pelo particionamento de cada cliente e pela classificação por data do pedido. Isso atribui um número sequencial a cada pedido, começando pelo mais antigo. Ao filtrar usando QUALIFY row_num = 1, garantimos que apenas o pedido mais antigo de cada cliente seja mantido.

Essa técnica é comumente usada em tarefas de deduplicação durante a limpeza de dados.

Exemplo 3: Filtragem baseada na função de janela em agregados

Vamos nos tornar um pouco mais sofisticados. O uso do site QUALIFY com funções de janela agregadas permite uma filtragem mais flexível e dinâmica.

Por exemplo, se quisermos encontrar os funcionários cujos salários estão acima da média do departamento, podemos usar QUALIFY com AVG() em uma função de janela:

SELECT 
employee_id, 
department, 
salary,
AVG(salary) OVER (PARTITION BY department) AS avg_salary
FROM employees
QUALIFY salary > avg_salary;

Esse tipo de lógica é excelente para identificar exceções ou os melhores desempenhos em grupos de colegas.

> Se você deseja aprimorar suas habilidades em SQL para consultas mais complexas como essas, confira nosso curso SQL Intermediário.

Práticas recomendadas para usar o QUALIFY no Snowflake

Aqui estão algumas práticas recomendadas e usos de uma cláusula QUALIFY

Simplificar consultas complexas

O poder do QUALIFY está em sua capacidade de simplificar as consultas, eliminando a necessidade de subconsultas e CTEs adicionais. Você pode se apoiar nessa funcionalidade. Use-o sempre que você escrever uma função de janela e precisar filtrar com base em sua saída, sem criar uma subconsulta.

Menos CTEs significam depuração mais fácil, lógica mais clara e melhor capacidade de manutenção.

Combine o QUALIFY com outras funções da janela

Você pode combinar várias funções de janela para obter uma filtragem mais refinada. Por exemplo, usando ROW_NUMBER() junto com RANK() para resolver empates na classificação e, ao mesmo tempo, limitar os resultados:

SELECT 
employee_id, 
department, 
salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank,
       ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC, employee_id) AS row_num
FROM employees
QUALIFY rank <= 3 AND row_num <= 3;

Essa consulta retorna os funcionários que estão entre as três primeiras posições salariais em seu departamento. No entanto, se houver mais de três funcionários empatados entre os três primeiros, ele mostrará apenas os três primeiros ordenados pelo ID do funcionário.

Considerações sobre o desempenho

Embora o site QUALIFY simplifique as consultas em termos de código escrito, alguns aspectos de desempenho devem ser considerados.

As funções de janela podem ser caras do ponto de vista computacional, e as consultas mal estruturadas podem exigir muitos recursos. Lembre-se de manter esses conceitos em mente:

  • As funções de janela podem ser computacionalmente caras em grandes conjuntos de dados, portanto, tenha cuidado com o estágio do processo em que você as utiliza.
  • Garanta a indexação e o particionamento adequados para otimizar o desempenho.
  • Use o LIMIT em conjunto com o QUALIFY para obter ainda mais eficiência durante os testes.
  • Use a ferramenta Query Profile do Snowflake para identificar gargalos de desempenho em consultas com janelas.

Solução de problemas de consultas QUALIFY

Pode ser fácil cair em armadilhas com os comandos QUALIFY, dada a complexidade das funções de janela. Aqui estão algumas dicas para ajudar com os problemas mais comuns que você pode encontrar.

1. Uso de funções de janela na cláusula WHERE

A tentativa de usar funções de janela diretamente na cláusula WHERE resultará em erros porque WHERE é avaliado antes que as funções de janela sejam processadas.

-- This will cause an error
SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
WHERE rank = 1;

Solução: Em vez disso, use a cláusula QUALIFY, que é avaliada após as funções de janela.

SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;

2. Omitir o predicado em QUALIFY

A cláusula QUALIFY requer um predicado para filtrar os resultados das funções de janela. Se você omitir o predicado, ocorrerão erros.

-- This will cause an error
SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY RANK() OVER (PARTITION BY department ORDER BY salary DESC);

Solução: Certifique-se de que a cláusula QUALIFY inclua um predicado, como = 1, para filtrar a linha mais bem classificada.

SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;

3. Aliases ambíguos

O uso do mesmo alias para uma coluna e uma função de janela pode gerar confusão e resultados inesperados.

-- Potentially ambiguous
SELECT salary AS rank,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;

Solução: Use aliases distintos para evitar ambiguidade.

SELECT salary AS salary_amount,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank
FROM employees
QUALIFY salary_rank = 1;

4. Particionamento ou ordenação incorretos

A especificação incorreta das cláusulas PARTITION BY ou ORDER BY nas funções de janela pode levar a resultados inesperados.

Solução: Defina cuidadosamente o particionamento e a ordenação para que correspondam à lógica desejada. Por exemplo, para obter o salário mais alto por departamento:

SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;

Conclusão

A cláusula QUALIFY no Snowflake é uma ferramenta poderosa para filtrar resultados com base em funções de janela, reduzindo a necessidade de subconsultas e tornando as consultas mais legíveis. Ao entender como usá-lo de forma eficaz, os cientistas de dados podem simplificar suas consultas e aumentar a eficiência ao trabalhar com dados classificados, agrupados ou agregados.

Você está pronto para aprofundar suas habilidades em Snowflake e SQL? Comece com nosso curso Introduction to Snowflake, aprimore suas consultas analíticas no curso PostgreSQL window functions ou avance em sua carreira com o Associate Data Engineer in SQL track!

Perguntas frequentes

Como o QUALIFY difere do WHERE e do HAVING?

  • WHERE filtra os dados brutos antes da agregação.
  • HAVING filtra dados agregados após GROUP BY.
  • QUALIFY filtra os resultados depois que as funções de janela são aplicadas.

O QUALIFY melhora o desempenho da consulta?

QUALIFY pode simplificar as consultas e reduzir a necessidade de subconsultas, mas o desempenho depende do tamanho dos dados e da indexação. O particionamento adequado pode ajudar a otimizar o desempenho.

Posso usar o QUALIFY com funções de janela que não sejam de classificação, como SUM() ou AVG()?

Sim, mas certifique-se de que a condição de filtragem faça sentido. Por exemplo, a filtragem de funcionários com salários acima da média funciona porque o AVG() pode ser calculado por partição.

Posso usar várias funções de janela com o QUALIFY?

Sim. Você pode combinar várias funções de janela em uma única consulta e usar condições lógicas em QUALIFY para filtrar com base em uma ou mais delas.

Quando você não deve usar o QUALIFY no Snowflake?

Evite o site QUALIFY se a sua lógica não depender de funções de janela ou se isso dificultar a depuração da consulta devido à lógica complexa aninhada.

O QUALIFY é compatível com todas as funções de janela no Snowflake?

Sim. Funções como ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE(), e funções agregadas com OVER() podem ser filtradas usando QUALIFY.

O QUALIFY é específico para o Snowflake?

Embora o QUALIFY seja compatível com o Snowflake e algumas outras plataformas, como o BigQuery, ele não faz parte do ANSI SQL padrão, portanto, a portabilidade pode ser um problema.

Posso aninhar o QUALIFY dentro de CTEs ou subconsultas?

Sim, o site QUALIFY pode ser usado dentro de CTEs (Common Table Expressions) ou subconsultas, proporcionando flexibilidade para o design modular de SQL.

Como faço para depurar erros relacionados ao QUALIFY no Snowflake?

Comece verificando os conflitos de alias, garantindo que todas as funções de janela estejam definidas corretamente e usando o Query Profile do Snowflake para solucionar problemas de desempenho ou de lógica.


Tim Lu's photo
Author
Tim Lu
LinkedIn

Sou um cientista de dados com experiência em análise espacial, machine learning e pipelines de dados. Trabalhei com GCP, Hadoop, Hive, Snowflake, Airflow e outros processos de engenharia/ciência de dados.

Tópicos

Você pode aprender mais sobre o Snowflake com estes cursos!

Programa

Engenheiro de Dados Associado no Snowflake

0 min
Aprenda a projetar, consultar e construir no Snowflake - dominando o Snowflake SQL para transformação e modelagem para se tornar um Engenheiro de Dados pronto para o trabalho.
Ver detalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado

blog

Qual é a melhor certificação Snowflake para 2024?

Descubra as principais certificações Snowflake para 2024 com nosso guia abrangente. Descubra qual certificação da Snowflake se alinha com seus objetivos de carreira.
Matt Crabtree's photo

Matt Crabtree

11 min

blog

As 20 principais perguntas do Snowflake para entrevistas de todos os níveis

Você está procurando um emprego que utilize o Snowflake? Prepare-se com estas 20 principais perguntas da entrevista do Snowflake para conseguir o emprego!
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

15 min

Tutorial

QUALIFICAR: A instrução de filtragem SQL que você nunca soube que precisava

Saiba mais sobre a cláusula SQL QUALIFY, um método de filtragem essencial, porém menos conhecido, no SQL. Entenda sua sintaxe, usos e como ela difere de outros métodos de filtragem SQL.
Kurtis Pykes 's photo

Kurtis Pykes

Tutorial

Como usar um alias SQL para simplificar suas consultas

Explore como o uso de um alias SQL simplifica os nomes de colunas e tabelas. Saiba por que usar um alias SQL é fundamental para melhorar a legibilidade e gerenciar uniões complexas.
Allan Ouko's photo

Allan Ouko

Tutorial

Como usar GROUP BY e HAVING no SQL

Um guia intuitivo para você descobrir os dois comandos SQL mais populares para agregar linhas do seu conjunto de dados
Eugenia Anello's photo

Eugenia Anello

Tutorial

Exemplos e tutoriais de consultas SQL

Se você deseja começar a usar o SQL, nós o ajudamos. Neste tutorial de SQL, apresentaremos as consultas SQL, uma ferramenta poderosa que nos permite trabalhar com os dados armazenados em um banco de dados. Você verá como escrever consultas SQL, aprenderá sobre
Sejal Jaiswal's photo

Sejal Jaiswal

Ver maisVer mais