Preciso consultar um banco de dados SQL para encontrar todos os valores distintos de uma coluna e preciso de um valor arbitrário de outra coluna. Por exemplo, considere a seguinte tabela com duas colunas, chave e valor:
key value
=== =====
one test
one another
one value
two goes
two here
two also
three example
Desejo recuperar uma linha de amostra, escolhida arbitrariamente, de cada chave distinta, talvez recebendo essas três linhas:
key value
=== =====
one test
two goes
three example
Como posso formular essa consulta no SQL?
Respostas:
A consulta mais fácil de escrever é para o MySQL (com configurações ANSI não estritas). Ele usa a construção não padrão:
Na versão recente (5.7 e 8.0+), nas quais as configurações estritas
ONLY_FULL_GROUP_BY
são o padrão, é possível usar aANY_VALUE()
função adicionada em 5.7:Para outros DBMSs, que possuem funções de janela (como Postgres, SQL-Server, Oracle, DB2), você pode usá-los assim. A vantagem é que você também pode selecionar outras colunas no resultado (além de
key
evalue
):Para versões anteriores do acima e para qualquer outro DBMS, uma maneira geral que funciona em quase todos os lugares. Uma desvantagem é que você não pode selecionar outras colunas com essa abordagem. Outra é que funções agregadas como
MIN()
eMAX()
não funcionam com alguns tipos de dados em alguns DBMSs (como bit, texto, blobs):O PostgreSQL possui um
DISTINCT ON
operador especial não padrão que também pode ser usado. O opcionalORDER BY
é para selecionar qual linha de cada grupo deve ser selecionada:fonte
ORDER BY whatever
consulta no ypercube por uma chamada para uma função para randomizar os resultados.Para MS-SQl Server:
Da mesma forma, você poderia ter rownum = 2 para o seu segundo conjunto de resultados
fonte
Semelhante à resposta aceita, mas em vez de min () ou max () você pode usar array_agg ()
Opcionalmente, você pode solicitar valores dentro da matriz para selecionar o maior ou o menor deles:
(verificado no PostgreSQL)
fonte