すべてのプロダクト
Search
ドキュメントセンター

Hologres:QUALIFY (Beta)

最終更新日:Oct 31, 2025

QUALIFY 句は、SELECT 文のウィンドウ関数の結果をフィルターします。このトピックでは、QUALIFY 句の構文と使用方法について説明します。

QUALIFY 句は、HAVING 句が集計関数の結果をフィルターするのと同様に、ウィンドウ関数の結果をフィルターします。QUALIFY 句は、ウィンドウ関数が計算された後に評価されます。SELECT 文の句は、次の順序で実行されます。

  1. FROM

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. WINDOW

  6. QUALIFY

  7. DISTINCT

  8. ORDER BY

  9. LIMIT

構文

QUALIFY <predicate>

QUALIFY を含む文は、次の形式になります。

SELECT <column_list>
  FROM <data_source>
  [GROUP BY ...]
  [HAVING ...]
  QUALIFY <predicate>
  [ ... ]

パラメーター

パラメーター

説明

column_list

SELECT 文の射影句のルールに従います。

data_source

テーブル、またはビューなどの別のテーブルのようなソース。

predicate

集計関数とウィンドウ関数の後に結果をフィルターする式です。predicateHAVING 句に似ていますが、HAVING キーワードは省略されます。ウィンドウ関数を含めることもできます。

使用上の注意

  • QUALIFY 句では、SELECT 文の次の句の少なくとも 1 つに、少なくとも 1 つのウィンドウ関数を指定する必要があります。

    • column_list

    • predicate

  • ウィンドウ関数を含む 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 |
    +---+---+---+---------+