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

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

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