ANY_VALUE¶
返回组中表达式的某些值。结果是不确定的。
语法¶
聚合函数
ANY_VALUE( [ DISTINCT ] <expr1> )
窗口函数
ANY_VALUE( [ DISTINCT ] <expr1> ) OVER ( [ PARTITION BY <expr2> ] )
实参¶
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;
在此查询中,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;