- Categorias:
Funções de agregação (Geral) , Funções de janela (Geral)
ANY_VALUE¶
Retorna algum valor da expressão do grupo. O resultado é não determinístico.
Sintaxe¶
Função de agregação
ANY_VALUE( [ DISTINCT ] <expr1> )
Função de janela
ANY_VALUE( [ DISTINCT ] <expr1> ) OVER ( [ PARTITION BY <expr2> ] )
Notas de uso¶
A palavra-chave DISTINCT pode ser especificada para esta função, mas não tem qualquer efeito.
Quando usado como uma função de janela:
Esta função não oferece suporte para:
Subcláusula ORDER BY na cláusula OVER().
Quadros de janela.
Usando ANY_VALUE com instruções GROUP BY¶
ANY_VALUE pode simplificar e otimizar o desempenho das instruções GROUP BY. Um problema comum em muitas consultas é que o resultado de uma consulta com uma cláusula GROUP BY só pode conter expressões usadas na própria cláusula GROUP BY, ou resultados de funções agregadas. Por exemplo:
SELECT customer.id , customer.name , SUM(orders.value)
FROM customer
JOIN orders ON customer.id = orders.customer_id
GROUP BY customer.id , customer.name;
Nesta consulta, o atributo customer.name
precisa estar no GROUP BY para ser incluído no resultado. Isso é desnecessário (por exemplo, quando customer.id
é conhecido por ser único) e torna o cálculo possivelmente mais complexo e mais lento. Outra opção é a utilização de uma função agregada. Por exemplo:
SELECT customer.id , MIN(customer.name) , SUM(orders.value)
FROM customer
JOIN orders ON customer.id = orders.customer_id
GROUP BY customer.id;
Isto simplifica a cláusula GROUP BY, mas ainda requer o cálculo da função MIN, o que implica em um custo extra.
Com ANY_VALUE, você pode executar a seguinte consulta:
SELECT customer.id , ANY_VALUE(customer.name) , SUM(orders.value)
FROM customer
JOIN orders ON customer.id = orders.customer_id
GROUP BY customer.id;