カテゴリ:

集計関数 (一般)、 ウィンドウ関数 (一般)

ANY_VALUE

グループから式の値を返します。結果は非決定的です。

構文

集計関数

ANY_VALUE( [ DISTINCT ] <expr1> )
Copy

ウィンドウ関数

ANY_VALUE( [ DISTINCT ] <expr1> ) OVER ( [ PARTITION BY <expr2> ] )
Copy

使用上の注意

  • この関数には DISTINCT キーワードを指定できますが、効果はありません。

  • ウィンドウ関数として使用する場合:

    • この関数は次をサポートしていません。

      • OVER()句のORDER BY サブ句。

      • ウィンドウフレーム。

ANY_VALUE と GROUP BY ステートメントの併用

ANY_VALUE により、 GROUP BY ステートメントのパフォーマンスを簡素化および最適化できます。多くのクエリに共通する問題は、 GROUP BY 句を含むクエリの結果に、 GROUP BY 句自体で使用される式、または集計関数の結果しか含まれないことです。例:

SELECT customer.id , customer.name , SUM(orders.value)
    FROM customer
    JOIN orders ON customer.id = orders.customer_id
    GROUP BY customer.id , customer.name;
Copy

このクエリでは、結果に含むためには customer.name 属性が GROUP BY に含まれている必要があります。これは不要で(例えば customer.id が一意であることがわかっている場合)、計算がより複雑で遅くなる可能性があります。別のオプションは、集計関数を使用することです。例:

SELECT customer.id , MIN(customer.name) , SUM(orders.value)
    FROM customer
    JOIN orders ON customer.id = orders.customer_id
    GROUP BY customer.id;
Copy

これにより、 GROUP BY 句が簡素化されますが、引き続き MIN 関数を計算する必要があり、余分なコストが発生します。

ANY_VALUE を使用すると、次のクエリを実行できます。

SELECT customer.id , ANY_VALUE(customer.name) , SUM(orders.value)
    FROM customer
    JOIN orders ON customer.id = orders.customer_id
    GROUP BY customer.id;
Copy