[SQL] Seleccionar la penúltima fecha

harry_le_ravi -  
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

harry_le_ravi
 
¡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.
3
harry_le_ravi
 
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));
1
Airmanbzh Mensajes publicados 122 Estado Miembro 9
 
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)
 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.
1
Airmanbzh Mensajes publicados 122 Estado Miembro 9
 
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.
1
dvphamid Mensajes publicados 17 Estado Miembro 1
 
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.
0
harry_le_ravi
 
What would what you propose look like in SQL?
0
dvphamid Mensajes publicados 17 Estado Miembro 1
 
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.
0
harry_le_ravi
 
No sé qué es eso del código transact, pero bueno, dame siempre.
0
Airmanbzh Mensajes publicados 122 Estado Miembro 9
 
Para la versión SQL, habría hecho algo así:
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.
0