MaxComputeでは、QUALIFY句を使用して、指定されたフィルターに基づいてウィンドウ関数によって返された結果をフィルター処理できます。 QUALIFY句を使用して、HAVING句を使用して集計関数およびGROUP by句によって返された結果をフィルタリングするのと同じ方法で、ウィンドウ関数によって返された結果をフィルタリングできます。 このトピックでは、QUALIFY句の構文について説明し、QUALIFY句の使用方法の例を示します。
概要
通常のSELECTステートメントでは、句は次の順序で実行されます。
FROM
WHERE
GROUP BYと集計関数
HAVING
WINDOW
QUALIFY
DISTINCT
ORDER BY
LIMIT
ほとんどの場合、SELECTステートメントのQUALIFY句は、window関数の後に実行され、window関数によって返される結果をフィルタリングします。
使用上の注意
QUALIFY句では、SELECTステートメントで少なくとも1つのウィンドウ関数を指定する必要があります。 それ以外の場合、次のエラーが返されます。
FAILED: ODPS-0130071:[3,1] セマンティック分析例外-ウィンドウ関数なしでQUALIFY句を使用
します。 無効なサンプルコード:SELECT * FROM values (1, 2) t(a, b) QUALIFY a > 1;
QUALIFY句では、SELECTステートメントで指定されている列のエイリアスをフィルターとして使用できます。 サンプルコード:
SELECT sum(t.a) over (partition by t.b) as c1 FROM values (1, 2) t(a, b) QUALIFY c1 > 1;
構文
QUALIFY <expression>
expression
をフィルター式に置き換えます。
例
元のステートメントを単純化するには、QUALIFY句を使用します。
QUALIFY句と返された結果を使用しないSQL文:
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; -- The following result is returned: +------+------------+ | col1 | col2 | +------+------------+ | 2 | 2 | +------+------------+
QUALIFY句と返された結果を使用するSQL文:
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; -- The following result is returned: +------+------------+ | col1 | col2 | +------+------------+ | 2 | 2 | +------+------------+
QUALIFY句では、列エイリアスの代わりにウィンドウ関数をフィルタとして使用することもできます。 例:
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; -- The following result is returned: +------+------------+ | col1 | col2 | +------+------------+ | 2 | 2 | +------+------------+
QUALIFY、WHERE、およびHAVING句はすべて、データのフィルタリングに使用されます。 SELECTステートメントの実行順序が異なります。 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>);
QUALIFY句は、ウィンドウ関数の後に実行されます。 次の複雑なステートメントは、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; -- The following result is returned: +------+------+------+ | a | b | _c2 | +------+------+------+ | 2 | 3 | 6 | | 2 | 4 | 7 | +------+------+------+