En Sqlite 3, estoy tratando de descubrir cómo seleccionar filas en función de un valor mínimo. Creo que estoy limitado por no saber lo suficiente de la terminología relacionada para buscar en Google de manera efectiva.
La mesa se ve así:
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 a 3
1 b 4
Quiero obtener las filas donde num2
está 1, 2
, y 4
. Quiero hacer la selección basada en el valor mínimo de num para cada valor único de la columna de texto.
Entonces, para text = 'a'
, el valor mínimo de num
es 0
, entonces quiero las filas 1 y 2. Para text = 'b'
, el valor mínimo de num
es 1
, entonces quiero la fila 4
.
Usando varias combinaciones de group by, puedo obtener filas 1
y / 2
o filas 1
y 4
. Siento que me falta un componente SQL que haga lo que quiero, pero no he podido averiguar qué podría ser.
¿Cuál es la forma correcta de hacer este tipo de consulta?
Solución posible
He encontrado una manera de hacer esto. No tengo la reputación suficiente para responder mi propia pregunta, así que estoy haciendo la actualización aquí. No estoy seguro si siempre es correcto o cómo es la eficiencia. Cualquier comentario es bienvenido.
Usé una declaración de selección compuesta, donde una consulta encuentra el valor mínimo de num para cada valor único de texto:
sqlite> select num, text from t group by text having num = min( num );
num text
---------- ----------
0 a
1 b
Luego me uní a esto con la tabla completa para obtener todas las filas que coinciden con estas dos columnas.
sqlite> with u as
( select num, text from t group by text having num = min( num ) )
select t.* from t join u on t.num = u.num and t.text = u.text;
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 b 4
u
consulta se almacena en una tabla temporal, independientemente de si está escrito como un CTE, una vista o en línea como una subconsulta.Tiendo a hacer este tipo de cosas con una autounión externa:
Esto es básicamente decir; dame todos los registros que no tengan un valor más alto, es decir, nulo.
fuente
Entonces, ¿cómo puede encontrar la respuesta a su pregunta la próxima vez? En mi opinión, es descomponiendo y siguiendo la lógica. Y lo entendiste bien:
Esto se traduce en:
(Esto debería ser equivalente a su
having
consulta. Puede ser interesante echar un vistazo a las filas dondenum
es igual a NULL. Para ser más precisos: eche un vistazo a qué efecto tienen las filas con valores nulos, que es posible que desee filtrar primero con awhere num is not null
)Desde aquí puede lograr el resultado deseado:
O usando una unión:
Y cuando el rendimiento no sea suficiente para sus tablas, comience a buscar declaraciones más complejas.
fuente
¿No debería ser esta consulta exactamente lo que necesita?
fuente
num2
valores son únicos.