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> )
Copy

Função de janela

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

Argumentos

expr1

A expressão de entrada.

expr2

A coluna para particionar, se você quiser que o resultado seja dividido em várias partições.

Retornos

Esta função pode retornar um valor de qualquer tipo de dados.

Se a expressão de entrada for NULL, a função retornará NULL.

Notas de uso

  • A palavra-chave DISTINCT pode ser especificada para esta função, mas não tem qualquer efeito.

  • A função não exclui os valores de NULL. Se a expressão contiver valores NULL, a função poderá retornar um valor NULL.

  • Quando esta função é chamada como uma função de janela, ela não oferece suporte para:

    • Uma cláusula ORDER BY dentro da cláusula OVER.

    • Quadros de janela explícitos.

Uso do 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;
Copy

Nesta consulta, o atributo customer.name precisa estar no GROUP BY para ser incluído no resultado. Isso é desnecessário (por exemplo, quando se sabe que customer.id é único) e torna a computação possivelmente mais complexa e lenta. 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;
Copy

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;
Copy