类别:

聚合函数 (通用)、 窗口函数 (通用)

ANY_VALUE

返回组中表达式的某些值。结果是不确定的。

语法

聚合函数

ANY_VALUE( [ DISTINCT ] <expr1> )
Copy

窗口函数

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

实参

expr1

输入表达式。

expr2

要对其进行分区的列(如果要将结果拆分为多个分区)。

返回

此函数可以返回任何数据类型的值。

如果输入表达式为 NULL,则函数返回 NULL。

使用说明

  • 可以为此函数指定 DISTINCT 关键字,但它没有任何效果。

  • 该函数不排除 NULL 值。如果表达式包含 NULL 值,则函数可以返回 NULL 值。

  • 当此函数作为窗口函数调用时,它不支持:

    • 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
语言: 中文