Clausola QUALIFY - Amazon Redshift

Amazon Redshift non supporterà più la creazione di nuove UDF Python a partire dal 1º novembre 2025. Se desideri utilizzare le UDF Python, creale prima di tale data. Le UDF Python esistenti continueranno a funzionare normalmente. Per ulteriori informazioni, consulta il post del blog.

Clausola QUALIFY

La clausola QUALIFY filtra i risultati di una funzione finestra calcolata in precedenza in base alle condizioni di ricerca specificate dall'utente. È possibile utilizzare la clausola per applicare condizioni di filtro al risultato di una funzione finestra senza utilizzare una sottoquery.

È simile alla clausola HAVING, che applica una condizione per filtrare ulteriormente le righe di una clausola WHERE. La differenza tra QUALIFY e HAVING è che i risultati filtrati dalla clausola QUALIFY potrebbero essere basati sul risultato dell'esecuzione delle funzioni finestra sui dati. Puoi utilizzare entrambe le clausole QUALIFY e HAVING in un'unica query.

Sintassi

QUALIFY condition
Nota

Se utilizzi la clausola QUALIFY direttamente dopo la clausola FROM, il nome della relazione FROM deve avere un alias specificato prima della clausola QUALIFY.

Esempi

Gli esempi in questa sezione utilizzano i dati di esempio riportati di seguito.

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);

L'esempio seguente mostra come trovare i due articoli più costosi venduti dopo le 12:00 di ogni giorno.

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

È quindi possibile trovare l’ultimo articolo venduto ogni giorno.

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

L’esempio seguente restituisce gli stessi risultati dell’ultima query, ovvero l’ultimo articolo venduto ogni giorno, ma non utilizza la clausola 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