QUALIFY 句は、SELECT 文のウィンドウ関数の結果をフィルターします。このトピックでは、QUALIFY 句の構文と使用方法について説明します。
QUALIFY 句は、HAVING 句が集計関数の結果をフィルターするのと同様に、ウィンドウ関数の結果をフィルターします。QUALIFY 句は、ウィンドウ関数が計算された後に評価されます。SELECT 文の句は、次の順序で実行されます。
FROM
WHERE
GROUP BY
HAVING
WINDOW
QUALIFY
DISTINCT
ORDER BY
LIMIT
構文
QUALIFY <predicate>QUALIFY を含む文は、次の形式になります。
SELECT <column_list>
FROM <data_source>
[GROUP BY ...]
[HAVING ...]
QUALIFY <predicate>
[ ... ]パラメーター
パラメーター | 説明 |
column_list |
|
data_source | テーブル、またはビューなどの別のテーブルのようなソース。 |
predicate | 集計関数とウィンドウ関数の後に結果をフィルターする式です。 |
使用上の注意
QUALIFY句では、SELECT文の次の句の少なくとも 1 つに、少なくとも 1 つのウィンドウ関数を指定する必要があります。column_listpredicate
ウィンドウ関数を含む
column_list内の式は、列のエイリアスで参照できます。QUALIFYは、そのpredicateで集約とサブクエリをサポートします。集約の場合、ルールはHAVING句と同じです。QUALIFYは予約キーワードです。QUALIFYの Snowflake 構文は、ANSI 標準の一部ではありません。
例
QUALIFY 句を使用すると、ウィンドウ関数の結果をフィルターするクエリが簡素化されます。QUALIFY を使用しない場合、このフィルター処理にはネストされたサブクエリが必要です。次の例では、ROW_NUMBER() 関数を使用して、各パーティションの最初の行のみを返します。テーブルを作成します。
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);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;クエリは次の結果を返します。
+---+---+---+---------+ | I | P | O | ROW_NUM | |---+---+---+---------| | 1 | A | 1 | 1 | | 3 | B | 1 | 1 | +---+---+---+---------+QUALIFYを使用します。SELECT i, p, o FROM qt QUALIFY ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) = 1;クエリは次の結果を返します。
+---+---+---+ | I | P | O | |---+---+---| | 1 | A | 1 | | 3 | B | 1 | +---+---+---+QUALIFY句で列のエイリアスを参照します。SELECT i, p, o, ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num FROM qt QUALIFY row_num = 1;クエリは次の結果を返します。
+---+---+---+---------+ | I | P | O | ROW_NUM | |---+---+---+---------| | 1 | A | 1 | 1 | | 3 | B | 1 | 1 | +---+---+---+---------+