[SQL] Seleccionar la penúltima fecha
harry_le_ravi
-
Airmanbzh Mensajes publicados 122 Estado Miembro -
Airmanbzh Mensajes publicados 122 Estado Miembro -
Hola a todos,
Estoy buscando 2 consultas SQL que me permitan obtener:
- el valor de un campo a donde el campo fecha es mayor que todos los demás
[CODE]Select table.a FROM table WHERE table.date > ALL[/CODE]
- el valor de un campo a donde el campo fecha corresponde a la antepenúltima fecha (la anterior a la consulta anterior)
Podrían decirme si la primera consulta es correcta y la solución para la segunda.
Gracias de antemano.
Configuración: Windows XP Internet Explorer 7.0
9 respuestas
¡Ah sí!
No había estudiado el LIMIT.
Me parece bastante bien.
Seleccióno los valores del campo a por fecha de forma descendente y muestro solo los dos primeros resultados.
Pero a nivel de optimización podría consumir bastantes recursos si tengo que seleccionar previamente todos los valores a de la tabla?
Hago un poco de pique igual, es solo por curiosidad.
Gracias.
No había estudiado el LIMIT.
Me parece bastante bien.
Seleccióno los valores del campo a por fecha de forma descendente y muestro solo los dos primeros resultados.
Pero a nivel de optimización podría consumir bastantes recursos si tengo que seleccionar previamente todos los valores a de la tabla?
Hago un poco de pique igual, es solo por curiosidad.
Gracias.
Se me propone esto para la primera consulta:
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE);
Para la segunda se me propone esto:
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE WHERE date < (SELECT max(date) FROM TABLE));
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE);
Para la segunda se me propone esto:
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE WHERE date < (SELECT max(date) FROM TABLE));
Sí, efectivamente, no me había fijado de que era otro campo que el campo fecha que querías recuperar.
La primera me parece correcta. Intenta probar sin el segundo select (por razones de optimización)
No sé si funciona o no de esa manera pero vale la pena intentarlo ;-)
Para la segunda, podría haber un error porque tu consulta anidada devuelve varios resultados
Por otro lado acabo de pensar en algo:
Una única consulta te devuelve 2 filas. La primera con el campo a correspondiente a la fecha más grande y una segunda con el campo a correspondiente a la fecha siguiente (es decir, la penúltima).
Más optimizado y menos enrevesado que todas las que hemos propuesto ;-).
Y si quieres 2 consultas obligatoriamente puedes hacer:
--
Un tema cerrado es un ahorro de tiempo para todos, así que pensad en cerrarlos.
La primera me parece correcta. Intenta probar sin el segundo select (por razones de optimización)
SELECT TABLE.a FROM TABLE WHERE TABLE.date = max(TABLE.date);
No sé si funciona o no de esa manera pero vale la pena intentarlo ;-)
Para la segunda, podría haber un error porque tu consulta anidada devuelve varios resultados
SELECT TABLE.a FROM TABLE WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE WHERE date < (SELECT max(date) FROM TABLE));
Por otro lado acabo de pensar en algo:
SELECT table.a FROM table ORDER BY table.date DESC LIMIT 0,2;
Una única consulta te devuelve 2 filas. La primera con el campo a correspondiente a la fecha más grande y una segunda con el campo a correspondiente a la fecha siguiente (es decir, la penúltima).
Más optimizado y menos enrevesado que todas las que hemos propuesto ;-).
Y si quieres 2 consultas obligatoriamente puedes hacer:
// fecha más grande SELECT table.a FROM table ORDER BY table.date DESC LIMIT 0,1; // Penúltima fecha SELECT table.a FROM table ORDER BY table.date DESC LIMIT 1,1;
--
Un tema cerrado es un ahorro de tiempo para todos, así que pensad en cerrarlos.
En realidad, MySQL va a recuperar todas las filas de tu tabla y las va a ordenar, así que será un algoritmo de complejidad "2n" dado el algoritmo de procesamiento de MySQL.
Por lo tanto, es mejor hacer eso que hacer 2 selects en una misma consulta con un filtro en los datos.
Para 5000 filas de datos:
Con ... LIMIT ... : 2n
Consultas anidadas: n^2+5000*(el número de filtros)
Es, por tanto, una ganancia de tiempo y de cálculos del procesador.
--
Un tema cerrado es una ganancia de tiempo para todos, así que piensen en cerrarlos.
Por lo tanto, es mejor hacer eso que hacer 2 selects en una misma consulta con un filtro en los datos.
Para 5000 filas de datos:
Con ... LIMIT ... : 2n
Consultas anidadas: n^2+5000*(el número de filtros)
Es, por tanto, una ganancia de tiempo y de cálculos del procesador.
--
Un tema cerrado es una ganancia de tiempo para todos, así que piensen en cerrarlos.
hola
puedes usar dos consultas
en la primera toma solo los dos primeros registros ordenados por fecha ascendente
y en la segunda toma la fecha máxima de la primera consulta.
o puedes, creo, hacer la maniobra con una sola consulta y aplicar lo mismo.
puedes usar dos consultas
en la primera toma solo los dos primeros registros ordenados por fecha ascendente
y en la segunda toma la fecha máxima de la primera consulta.
o puedes, creo, hacer la maniobra con una sola consulta y aplicar lo mismo.
y bueno, lo siento, no tengo SQL en mi PC, pero lo voy a instalar esta noche; si quieres, puedo darte el código Transact.
Para la versión SQL, habría hecho algo así:
Y creo que puedes recuperar tu fecha anterior usando una función tipo:
Explicaciones : obtienes la fecha que posee el mínimo número de días entre la fecha máxima y una fecha Y. La condición te permite filtrar que la fecha devuelta no sea la fecha máxima.
Espero que esto solucione tu problema.
Cdt
--
Un asunto cerrado es una ganancia de tiempo para todos, así que recuerda cerrarlos.
SELECT MAX(table.date) FROM table
Y creo que puedes recuperar tu fecha anterior usando una función tipo:
SELECT MIN(MAX(table.date) - table.date) FROM table WHERE TO_DAYS(MAX(table.date) - table.date) >0;
Explicaciones : obtienes la fecha que posee el mínimo número de días entre la fecha máxima y una fecha Y. La condición te permite filtrar que la fecha devuelta no sea la fecha máxima.
Espero que esto solucione tu problema.
Cdt
--
Un asunto cerrado es una ganancia de tiempo para todos, así que recuerda cerrarlos.