Cláusula QUALIFY
A cláusula QUALIFY filtra os resultados de uma função de janela previamente calculada de acordo com as condições de pesquisa especificadas pelo usuário. Você pode usar a cláusula para aplicar condições de filtragem ao resultado de uma função de janela sem usar uma subconsulta.
É semelhante à cláusula HAVING, que aplica uma condição para filtrar ainda mais as linhas de uma cláusula WHERE. A diferença entre QUALIFY e HAVING é que os resultados filtrados da cláusula QUALIFY podem ser baseados no resultado da execução de funções de janela nos dados. Você pode usar as cláusulas QUALIFY e HAVING na mesma consulta.
Sintaxe
QUALIFY condition
nota
Se você estiver usando a cláusula QUALIFY diretamente após a cláusula FROM, o nome da relação FROM deverá ter um alias especificado antes da cláusula QUALIFY.
Exemplos
Os exemplos desta seção utilizam os dados de amostra a seguir.
create table store_sales (ss_sold_date date, ss_sold_time time, ss_item text, ss_sales_price float); insert into store_sales values ('2022-01-01', '09:00:00', 'Product 1', 100.0), ('2022-01-01', '11:00:00', 'Product 2', 500.0), ('2022-01-01', '15:00:00', 'Product 3', 20.0), ('2022-01-01', '17:00:00', 'Product 4', 1000.0), ('2022-01-01', '18:00:00', 'Product 5', 30.0), ('2022-01-02', '10:00:00', 'Product 6', 5000.0), ('2022-01-02', '16:00:00', 'Product 7', 5.0);
O exemplo a seguir demonstra como encontrar os dois itens mais caros vendidos após as 12h de cada dia.
SELECT * FROM store_sales ss WHERE ss_sold_time > time '12:00:00' QUALIFY row_number() OVER (PARTITION BY ss_sold_date ORDER BY ss_sales_price DESC) <= 2
ss_sold_date | ss_sold_time | ss_item | ss_sales_price --------------+--------------+-----------+---------------- 2022-01-01 | 17:00:00 | Product 4 | 1000 2022-01-01 | 18:00:00 | Product 5 | 30 2022-01-02 | 16:00:00 | Product 7 | 5
Depois, você pode encontrar o último item vendido em cada dia.
SELECT * FROM store_sales ss QUALIFY last_value(ss_item) OVER (PARTITION BY ss_sold_date ORDER BY ss_sold_time ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) = ss_item;
ss_sold_date | ss_sold_time | ss_item | ss_sales_price --------------+--------------+-----------+---------------- 2022-01-01 | 18:00:00 | Product 5 | 30 2022-01-02 | 16:00:00 | Product 7 | 5
O exemplo a seguir retorna os mesmos registros que a consulta anterior, do último item vendido em cada dia, mas não usa a cláusula QUALIFY.
SELECT * FROM ( SELECT *, last_value(ss_item) OVER (PARTITION BY ss_sold_date ORDER BY ss_sold_time ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) ss_last_item FROM store_sales ss ) WHERE ss_last_item = ss_item;
ss_sold_date | ss_sold_time | ss_item | ss_sales_price | ss_last_item --------------+--------------+-----------+----------------+-------------- 2022-01-02 | 16:00:00 | Product 7 | 5 | Product 7 2022-01-01 | 18:00:00 | Product 5 | 30 | Product 5