MaxCompute memungkinkan Anda menggunakan klausa QUALIFY untuk menyaring hasil yang dikembalikan oleh fungsi jendela berdasarkan filter tertentu. Anda dapat menggunakan klausa QUALIFY seperti halnya menggunakan klausa HAVING untuk menyaring hasil dari fungsi agregat dan GROUP BY. Topik ini menjelaskan sintaksis klausa QUALIFY serta memberikan contoh penggunaannya.
Ikhtisar
Klausa QUALIFY dalam pernyataan SELECT umumnya dieksekusi setelah fungsi jendela. Klausa ini menyaring hasil yang dikembalikan oleh fungsi jendela. Dalam pernyataan SELECT, urutan eksekusi klausa adalah sebagai berikut:
FROM
WHERE
GROUP BY
HAVING
WINDOW
QUALIFY
DISTINCT
ORDER BY
LIMIT
Peringatan
Klausa QUALIFY dalam pernyataan SELECT harus mencakup setidaknya satu fungsi jendela. Jika tidak ada fungsi jendela yang ditentukan, kesalahan berikut akan muncul:
FAILED: ODPS-0130071:[3,1] Semantic analysis exception - use QUALIFY clause without window function. Contoh kode tidak valid:SELECT * FROM values (1, 2) t(a, b) QUALIFY a > 1;Dalam klausa QUALIFY, Anda dapat menggunakan alias kolom yang didefinisikan dalam pernyataan SELECT sebagai filter. Contoh kode:
SELECT sum(t.a) over (partition by t.b) as c1 FROM values (1, 2) t(a, b) QUALIFY c1 > 1;
Sintaksis
QUALIFY <expression>Ganti expression dengan ekspresi filter yang sesuai.
Contoh
Gunakan klausa QUALIFY untuk menyederhanakan pernyataan asli.
Pernyataan SQL tanpa klausa QUALIFY dan hasil yang dihasilkan:
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; -- Hasil berikut dikembalikan: +------+------------+ | col1 | col2 | +------+------------+ | 2 | 2 | +------+------------+Pernyataan SQL dengan klausa QUALIFY dan hasil yang dihasilkan:
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; -- Hasil berikut dikembalikan: +------+------------+ | col1 | col2 | +------+------------+ | 2 | 2 | +------+------------+Dalam klausa QUALIFY, Anda juga dapat menggunakan fungsi jendela sebagai filter alih-alih alias kolom. Contoh pernyataan:
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; -- Hasil berikut dikembalikan: +------+------------+ | col1 | col2 | +------+------------+ | 2 | 2 | +------+------------+
Klausa QUALIFY, WHERE, dan HAVING semuanya digunakan untuk menyaring data, tetapi berbeda dalam urutan eksekusi dalam pernyataan SELECT. Anda dapat menentukan filter kompleks dalam klausa QUALIFY.
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>);Klausa QUALIFY dieksekusi setelah fungsi jendela. Pernyataan kompleks berikut dapat membantu Anda memahami urutan eksekusi klausa QUALIFY.
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; -- Hasil berikut dikembalikan: +------+------+------+ | a | b | _c2 | +------+------+------+ | 2 | 3 | 6 | | 2 | 4 | 7 | +------+------+------+