カテゴリ:

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

ANY_VALUE

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

構文

集計関数

ANY_VALUE( [ DISTINCT ] <expr1> )

ウィンドウ関数

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

使用上の注意

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

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

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

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

      • ウィンドウフレーム。

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;

このクエリでは、結果に含むためには 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;

これにより、 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;

セットアップ:

CREATE OR REPLACE TABLE example_any(k int, d decimal(10,5));
INSERT INTO example_any VALUES (1, 1), (1, 5), (1, 10), (2, 2), (2, NULL), (2, 20);

SELECT * FROM example_any;

+---+----------+
| K |        D |
|---+----------|
| 1 |  1.00000 |
| 1 |  5.00000 |
| 1 | 10.00000 |
| 2 |  2.00000 |
| 2 |     NULL |
| 2 | 20.00000 |
+---+----------+

k でグループ化された example_any から任意の値を返します。

SELECT k, ANY_VALUE(d) FROM example_any GROUP BY k;

+---+--------------+
| K | ANY_VALUE(D) |
|---+--------------|
| 1 |      1.00000 |
| 2 |      2.00000 |
+---+--------------+

この例は前の例と同じで、結果が非決定的であることを示しています。

SELECT k, ANY_VALUE(d) FROM example_any GROUP BY k;

+---+--------------+
| K | ANY_VALUE(D) |
|---+--------------|
| 1 |      5.00000 |
| 2 |     20.00000 |
+---+--------------+