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

MaxCompute:QUALIFY

最終更新日:Dec 09, 2024

MaxComputeでは、QUALIFY句を使用して、指定されたフィルターに基づいてウィンドウ関数によって返された結果をフィルター処理できます。 QUALIFY句を使用して、HAVING句を使用して集計関数およびGROUP by句によって返された結果をフィルタリングするのと同じ方法で、ウィンドウ関数によって返された結果をフィルタリングできます。 このトピックでは、QUALIFY句の構文について説明し、QUALIFY句の使用方法の例を示します。

概要

ほとんどの場合、SELECTステートメントのQUALIFY句はwindow関数の後に実行されます。 これにより、ウィンドウ関数によって返される結果を除外できます。 通常のSELECTステートメントでは、句は次の順序で実行されます。

  1. FROM

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. HAVING

  6. QUALIFY

  7. DISTINCT

  8. ORDER BY

  9. LIMIT

注意事項

  • SELECTステートメントのQUALIFY句には、少なくとも1つのウィンドウ関数が含まれている必要があります。 QUALIFY句でウィンドウ関数が指定されていない場合、次のエラーが返されます。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    |
    +------+------+------+