Klausa QUALIFY digunakan untuk menyaring hasil dari fungsi jendela dalam pernyataan SELECT. Topik ini menjelaskan sintaksis dan penggunaan klausa QUALIFY.
Klausa QUALIFY menyaring hasil dari fungsi jendela, mirip dengan cara klausa HAVING menyaring hasil dari fungsi agregat. Klausa QUALIFY dievaluasi setelah fungsi jendela dihitung. Urutan eksekusi klausa dalam pernyataan SELECT adalah sebagai berikut:
FROM
WHERE
GROUP BY
HAVING
WINDOW
QUALIFY
DISTINCT
ORDER BY
LIMIT
Sintaksis
QUALIFY <predicate>Pernyataan yang mencakup QUALIFY memiliki format berikut:
SELECT <column_list>
FROM <data_source>
[GROUP BY ...]
[HAVING ...]
QUALIFY <predicate>
[ ... ]Parameter
Parameter | Deskripsi |
column_list | Mengikuti aturan untuk klausa proyeksi dalam pernyataan |
data_source | Tabel atau sumber lain yang menyerupai tabel, seperti tampilan. |
predicate | Ekspresi yang menyaring hasil setelah fungsi agregat dan fungsi jendela. |
Catatan Penggunaan
Klausa
QUALIFYmemerlukan setidaknya satu fungsi jendela yang didefinisikan di salah satu klausa berikut dalam pernyataanSELECT:column_listpredicate
Anda dapat merujuk ekspresi dalam
column_list, termasuk fungsi jendela, melalui alias kolom mereka.QUALIFYmendukung agregasi dan subkueri dalampredicate-nya. Untuk agregasi, aturannya sama seperti untuk klausaHAVING.QUALIFYadalah kata kunci yang dicadangkan.Sintaksis Snowflake untuk
QUALIFYbukan bagian dari standar ANSI.
Contoh
Klausa QUALIFY menyederhanakan kueri yang menyaring hasil dari fungsi jendela. Tanpa QUALIFY, penyaringan ini memerlukan subkueri bersarang. Contoh berikut menggunakan fungsi ROW_NUMBER() untuk mengembalikan hanya baris pertama dari setiap partisi. Buat tabel:
CREATE TABLE qt (i INTEGER, p TEXT, o INTEGER);
INSERT INTO qt (i, p, o) VALUES
(1, 'A', 1),
(2, 'A', 2),
(3, 'B', 1),
(4, 'B', 2);Gunakan sarang daripada
QUALIFY:SELECT * FROM ( SELECT i, p, o, ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num FROM qt) WHERE row_num = 1;Kueri mengembalikan hasil berikut:
+---+---+---+---------+ | I | P | O | ROW_NUM | |---+---+---+---------| | 1 | A | 1 | 1 | | 3 | B | 1 | 1 | +---+---+---+---------+Gunakan
QUALIFY:SELECT i, p, o FROM qt QUALIFY ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) = 1;Kueri mengembalikan hasil berikut:
+---+---+---+ | I | P | O | |---+---+---| | 1 | A | 1 | | 3 | B | 1 | +---+---+---+Rujuk alias kolom dalam klausa
QUALIFY:SELECT i, p, o, ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num FROM qt QUALIFY row_num = 1;Kueri mengembalikan hasil berikut:
+---+---+---+---------+ | I | P | O | ROW_NUM | |---+---+---+---------| | 1 | A | 1 | 1 | | 3 | B | 1 | 1 | +---+---+---+---------+