SELECTSELECT

SELECT

Filtre Window Functions de Forma Eficiente com o QUALIFY do Snowflake

By Jeff SkoldbergDec 9, 20244 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

O que é o QUALIFY no Snowflake?

A cláusula qualify no Snowflake, ou em SQL no geral, permite filtrar com base no resultado de uma window function. Como uma window function não pode ser usada diretamente na cláusula where, use o qualify sempre que precisar filtrar por window functions.

Uma revisão rápida sobre window functions

Uma window function é uma função que opera sobre um conjunto de linhas em relação à linha atual. Costumam ser usadas para calcular rankings, totais acumulados, médias móveis, contagens por partição etc. Sempre que precisar referenciar linhas acima ou abaixo da linha atual, você vai precisar de uma window function. E a cláusula qualify é só um atalho para filtrar pelo resultado dela.

Sintaxe do QUALIFY

A sintaxe do qualify é a seguinte:

SELECT <column_list>
FROM <data_source>
where <conditions>
[GROUP BY ...]
[HAVING ...]
QUALIFY  <predicate>
ORDER BY

Repare que o qualify aparece no final da query SQL, logo antes da cláusula opcional order by.

Exemplo 1: encontrando o melhor vendedor

Com base nos dados abaixo, vamos responder a duas perguntas de negócio.

Encontrando o melhor vendedor

  1. Quem é o melhor vendedor em cada região, em cada dia?
select
	salesperson_id,
	region,
	sales_amount,
	sales_date
from sales
qualify row_number() over (partition by region, sales_date order by sales_amount desc) = 1

O Snowflake vai retornar as linhas destacadas:

Encontrando o melhor vendedor

2. Quem é o melhor vendedor em cada dia?

select
	salesperson_id,
	region,
	sales_amount,
	sales_date
from sales
qualify row_number() over (partition by sales_date order by sales_amount desc) = 1

O Snowflake vai retornar as linhas destacadas:

Encontrando o melhor vendedor

Dica rápida: o reuso de alias funciona com a cláusula qualify! Se você precisar selecionar a window function de fato, e não só filtrar por ela, pode reaproveitar o alias dela.

select
	salesperson_id,
	region,
	sales_amount,
	sales_date,
	row_number() over (partition by sales_date order by sales_amount desc) sales_date_rank
from sales
qualify sales_date_rank = 1

Exemplo 2: encontrando registros duplicados

A cláusula qualify é o jeito mais rápido de descobrir quais registros estão derrubando um teste de unicidade no dbt, ou de isolar duplicatas a partir de uma combinação de colunas.

Imagine que você tem uma coluna id que é testada quanto à unicidade, e esse teste falhou. Você quer analisar todos os registros duplicados, com as duplicatas agrupadas.

A forma mais rápida de selecionar todos os registros do teste que falhou é esta:

select *
from my_table
qualify count(*) over (partition by id) > 1
order by id

Por que o QUALIFY é útil? Porque ele é um atalho!

Vamos ver outras formas de resolver a consulta de registros duplicados.

Opção 1:

-- use CTE with Group By instead
with duplicates as
(
	select id
	group by 1
	having count(*) > 1
)
select *
from
my_table join
duplicates using (id);

Opção 2

-- use CTE to create a window function, then filter on the window function
with window_count as
(
	select *, count(*) over (partition by id) as id_count
	from my_table
)
select * exclude (id_count)
from window_count
where id_count > 1;

Existem outras formas de resolver o mesmo problema, mas nenhuma é tão rápida e simples quanto usar a cláusula qualify.

Conclusão importante: o grande valor da cláusula qualify está em eliminar a necessidade de uma CTE para filtrar por uma window function. Como window functions não podem ser usadas diretamente na cláusula where, sem o qualify seria preciso recorrer a uma CTE para fazer essa filtragem.

Qual a diferença entre WHERE e QUALIFY no Snowflake?

Já vimos que o qualify filtra uma window function e não pode ser usado na cláusula where, mas vale aprofundar na ordem de operações do SQL.

Esta é a ordem em que o Snowflake processa o seu select:

Encontrando o melhor vendedor

Vale destacar que qualquer filtragem nas cláusulas from e where acontece antes da filtragem no qualify. Além disso, as agregações e a filtragem por agregação (group by e having) também vêm antes.

Reforçando: a cláusula qualify no Snowflake nada mais é do que um atalho que elimina CTEs e subqueries quando você quer filtrar por uma window function. Uso ela praticamente todo dia no meu trabalho para analisar duplicatas, removê-las (qualify row_number() … = 1) ou em cenários mais avançados de analytics.

Jeff é Consultor de Dados e Analytics com mais de 15 anos de experiência em automação de insights e no uso de dados para conduzir processos de negócio. Do lado tecnológico, é especialista em Snowflake + dbt + Tableau. Do lado de negócio, tem experiência em Utilities, Ensaios Clínicos, Publishing, CPG e Manufatura. Fale com ele quando quiser: [email protected].