O PostgreSQL é any_value
realmente arbitrário ao usar ORDER BY?
A documentação afirma:
any_value ( anyelement ) → igual ao tipo de entrada
Retorna um valor arbitrário dos valores de entrada não nulos.
Consultas de exemplo:
-- nonsensical
WITH vals (v) AS ( VALUES (1),(3),(4),(3),(2) )
SELECT any_value(v ORDER BY v = 3 DESC) FROM vals;
-- more realistic example
SELECT any_value(username ORDER BY user_id DESC) AS a_username FROM users;
Eu vi que a documentação da versão 17 inclui a seguinte cláusula:
Embora todos os agregados abaixo aceitem uma cláusula ORDER BY opcional (conforme descrito na Seção 4.2.7), a cláusula só foi adicionada aos agregados cuja saída é afetada pela ordenação.
Mas não menciona se a saída de any_value é afetada pela ordenação.
Com base em alguns testes, parece ser determinístico. (provavelmente porque any_value
retorna apenas o primeiro valor não nulo e respeita a ORDER BY)
Como pergunta complementar, se não for arbitrário, seria "ruim" confiar nesse comportamento?
O resultado é
any_value()
arbitrário? Sim. É aleatório? Não. Essas não são declarações incompatíveis.Sim (até o momento em que este artigo foi escrito).
Depende da sua definição de "ruim". Certamente não seria sensato, dado que o comportamento pode mudar sem aviso prévio, e que a própria definição de "qualquer" carece de determinismo (em outras palavras, se você quer um certo valor, não peça nenhum valor).
Acho que a intenção é que o efeito seja confiável apenas para agregados onde eles realmente mostram a
ORDER BY
cláusula na documentação da função. O resto aceitará, mas seu efeito não é documentado e não deve ser confiável.Na maioria dos casos
ORDER BY
é irrelevante, já que as funções são associativas e comutativas. Isso não é verdade paraANY_VALUE()
, mas já que a cláusula não é mostrada na sintaxe, não acho que você deva depender dela se comportando de alguma forma específica.Observe que todas as funções que a mencionam retornam algum tipo de array, e esta cláusula especifica a ordem dos itens no array.
ANY_VALUE()
não retorna uma coleção, então a ordem não é significativa.