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:
SELECT key, value
FROM tableX
GROUP BY key ;
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 a ANY_VALUE()
função adicionada em 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
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
e value
):
SELECT key, value
FROM tableX
( SELECT key, value,
ROW_NUMBER() OVER (PARTITION BY key
ORDER BY whatever) --- ORDER BY NULL
AS rn --- for example
FROM tableX
) tmp
WHERE rn = 1 ;
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()
e MAX()
não funcionam com alguns tipos de dados em alguns DBMSs (como bit, texto, blobs):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
O PostgreSQL possui um DISTINCT ON
operador especial não padrão que também pode ser usado. O opcional ORDER BY
é para selecionar qual linha de cada grupo deve ser selecionada:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;