La consulta más fácil de escribir es para MySQL (con configuraciones ANSI no estrictas). Utiliza la construcción no estándar:
SELECT key, value
FROM tableX
GROUP BY key ;
En la versión reciente (5.7 y 8.0+) donde las configuraciones estrictas y ONLY_FULL_GROUP_BY
las predeterminadas, puede usar la ANY_VALUE()
función, agregada en 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
Para otros DBMS, que tienen funciones de ventana (como Postgres, SQL-Server, Oracle, DB2), puede usarlas así. La ventaja es que también puede seleccionar otras columnas en el resultado (además de key
y 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 versiones anteriores de lo anterior y para cualquier otro DBMS, una forma general que funciona en casi todas partes. Una desventaja es que no puede seleccionar otras columnas con este enfoque. Otra es que las funciones agregadas tienen gusto MIN()
y MAX()
no funcionan con algunos tipos de datos en algunos DBMS (como bit, texto, blobs):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL tiene un DISTINCT ON
operador especial no estándar que también se puede usar. La opción ORDER BY
es para seleccionar qué fila de cada grupo debe seleccionarse:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;