Clausola QUALIFY - Amazon Redshift

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

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 da 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

Potrai quindi 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 record della query precedente, 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