A cláusula QUALIFY aplica-se a window functions assim como a cláusula HAVING se aplica a funções de agregação: filtra linhas com base nos resultados das funções de janela, sem exigir subconsulta.
Ordem de execução
Em uma instrução SELECT, a cláusula QUALIFY é executada após a avaliação das funções de janela:
FROM
WHERE
GROUP BY
HAVING
WINDOW
QUALIFY
DISTINCT
ORDER BY
LIMIT
Sintaxe
QUALIFY <expression>
Substitua <expression> por qualquer expressão de filtro que referencie uma função de janela.
Observações de uso
A cláusula QUALIFY deve conter pelo menos uma função de janela. Referencie a função de janela diretamente no predicado QUALIFY ou use um alias de coluna definido na lista SELECT.
O uso de QUALIFY sem uma função de janela retorna o seguinte erro:
FAILED: ODPS-0130071:[3,1] Semantic analysis exception - use QUALIFY clause without window function
Exemplo inválido:
SELECT *
FROM values (1, 2) t(a, b)
QUALIFY a > 1;
Exemplos
Simplificar a filtragem de funções de janela
Os exemplos a seguir produzem o mesmo resultado com a função de janela SUM e comparam as abordagens com subconsulta e com QUALIFY.
Sem QUALIFY — abordagem com subconsulta:
SELECT col1, col2
FROM
(
SELECT
t.a AS col1,
sum(t.a) OVER (PARTITION BY t.b) AS col2
FROM values (1, 2),(2,3) t(a, b)
)
WHERE col2 > 1;
Com QUALIFY — uso de alias de coluna:
SELECT
t.a AS col1,
sum(t.a) OVER (PARTITION BY t.b) AS col2
FROM values (1, 2),(2,3) t(a, b)
QUALIFY col2 > 1;
-- Result:
+------+------------+
| col1 | col2 |
+------+------------+
| 2 | 2 |
+------+------------+
Com QUALIFY — função de janela direta no predicado:
SELECT t.a AS col1,
sum(t.a) OVER (PARTITION BY t.b) AS col2
FROM values (1, 2),(2,3) t(a, b)
QUALIFY sum(t.a) OVER (PARTITION BY t.b) > 1;
-- Result:
+------+------------+
| col1 | col2 |
+------+------------+
| 2 | 2 |
+------+------------+
Usar filtro de subconsulta em QUALIFY
A cláusula QUALIFY aceita expressões de filtro complexas, incluindo subconsultas:
SELECT *
FROM values (1, 2),(2,3) t(a, b)
QUALIFY sum(t.a) OVER (PARTITION BY t.b) IN (SELECT a FROM <table_name>);
Combinar WHERE, GROUP BY, HAVING e QUALIFY
O exemplo abaixo demonstra a interação entre QUALIFY e as demais cláusulas de filtragem. Cada cláusula atua em uma etapa diferente da execução:
SELECT a, b, max(c)
FROM values (1, 2, 3),(1, 2, 4),(1, 3, 5),(2, 3, 6),(2, 4, 7),(3, 4, 8) t(a, b, c)
WHERE a < 3
GROUP BY a, b
HAVING max(c) > 5
QUALIFY sum(b) OVER (PARTITION BY a) > 3;
-- Result:
+------+------+------+
| a | b | _c2 |
+------+------+------+
| 2 | 3 | 6 |
| 2 | 4 | 7 |
+------+------+------+
WHERE a < 3— exclui linhas em quea = 3antes da agregaçãoHAVING max(c) > 5— remove grupos agregados com valor máximo igual ou inferior a 5QUALIFY sum(b) OVER (PARTITION BY a) > 3— filtra o resultado da função de janela após a conclusão da agregação