Necesito consultar una base de datos SQL para encontrar todos los valores distintos de una columna y necesito un valor arbitrario de otra columna. Por ejemplo, considere la siguiente tabla con dos columnas, clave y valor:
key value
=== =====
one test
one another
one value
two goes
two here
two also
three example
Deseo recuperar una fila de muestra, elegida arbitrariamente, de cada clave distinta, quizás obteniendo estas tres filas:
key value
=== =====
one test
two goes
three example
¿Cómo puedo formular una consulta de este tipo en SQL?
Respuestas:
La consulta más fácil de escribir es para MySQL (con configuraciones ANSI no estrictas). Utiliza la construcción no estándar:
En la versión reciente (5.7 y 8.0+) donde las configuraciones estrictas y
ONLY_FULL_GROUP_BY
las predeterminadas, puede usar laANY_VALUE()
función, agregada en 5.7: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
yvalue
):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()
yMAX()
no funcionan con algunos tipos de datos en algunos DBMS (como bit, texto, blobs):PostgreSQL tiene un
DISTINCT ON
operador especial no estándar que también se puede usar. La opciónORDER BY
es para seleccionar qué fila de cada grupo debe seleccionarse:fuente
ORDER BY whatever
en ypercube con una llamada a una función para aleatorizar los resultados.Para el servidor MS-SQl:
Del mismo modo, podría tener rownum = 2 para su segundo conjunto de resultados
fuente
Similar a la respuesta aceptada, pero en lugar de min () o max () puede usar array_agg ()
Opcionalmente, puede ordenar valores dentro de la matriz para seleccionar el más grande o el más pequeño de ellos:
(marcado en PostgreSQL)
fuente