Cómo seleccionar el conjunto más reciente de registros fechados de una tabla mysql
-
22-07-2019 - |
Pregunta
Estoy almacenando la respuesta a varias llamadas rpc en una tabla mysql con los siguientes campos:
Table: rpc_responses
timestamp (date)
method (varchar)
id (varchar)
response (mediumtext)
PRIMARY KEY(timestamp,method,id)
¿Cuál es el mejor método para seleccionar las respuestas más recientes para todas las combinaciones existentes de method
y id
?
-
Para cada fecha solo puede haber una respuesta para un método / id dado.
-
No todas las combinaciones de llamadas están necesariamente presentes para una fecha determinada.
-
Hay docenas de métodos, miles de identificadores y al menos 365 fechas diferentes
Datos de muestra:
timestamp method id response
2009-01-10 getThud 16 "....."
2009-01-10 getFoo 12 "....."
2009-01-10 getBar 12 "....."
2009-01-11 getFoo 12 "....."
2009-01-11 getBar 16 "....."
Resultado deseado:
2009-01-10 getThud 16 "....."
2009-01-10 getBar 12 "....."
2009-01-11 getFoo 12 "....."
2009-01-11 getBar 16 "....."
(No creo que esta sea la misma pregunta - no me dará la respuesta
)
Solución 2
Respondió uno mismo, pero no estoy seguro de que será una solución lo suficientemente eficiente como la tabla crece:
SELECT timestamp,method,id,response FROM rpc_responses
INNER JOIN
(SELECT max(timestamp),method,id FROM rpc_responses GROUP BY method,id) latest
USING (timestamp,method,id);
Otros consejos
Use esta solución con precaución:
no se garantiza que funcione en futuras versiones de mysql
no se sabe que funcione en mariadb 5.5
Esta consulta puede funcionar bien, porque no hay combinaciones.
SELECT * FROM (
SELECT timestamp, method, id, response
FROM rpc_responses
WHERE 1 # some where clause here
ORDER BY timestamp DESC
) as t1
GROUP BY method
El grupo "por", colapsa el conjunto de resultados en el método y devuelve solo 1 fila por método, la más reciente, debido a la DESC de la marca de tiempo ORDER BY en la consulta interna.
Para su información, PostgreSQL tiene una forma de hacer esto integrado en el lenguaje:
SELECT DISTINCT ON (method) timestamp, method, id, response
FROM rpc_responses
WHERE 1 # some where clause here
ORDER BY method, timestamp DESC
Prueba esto ...
SELECT o1.id, o1.timestamp, o1.method, o1.response
FROM rpc_responses o1
WHERE o1.timestamp = ( SELECT max(o2.timestamp)
FROM rpc_responses o2
WHERE o1.id = o2.id )
ORDER BY o1.timestamp, o1.method, o1.response
... ¡incluso funciona en Access!
utilicé esto, funcionó para mí
select max(timestamp),method,id from tables where 1 group by method,id order by timestamp desc
La subconsulta es muy exigente cuando el conjunto de datos se hace más grande.
Prueba esto:
SELECT t1.*
FROM rpc_responses AS t1
INNER JOIN rpc_responses AS t2
GROUP BY t1.method, t1.id, t1.timestamp
HAVING t1.timestamp=MAX(t2.timestamp)
ORDER BY t1.timestamp, t1.method, t1.response;
El concepto de "más reciente" Es bastante vago. Si quiere decir algo así como las 100 filas más recientes, simplemente puede agregar un TOP (100)
a su cláusula SELECT
.
Si te refieres al " más reciente " basado en una fecha más reciente, entonces puede simplemente hacer
SELECT timestamp,method,id,response
FROM rpc_responses
HAVING max(timestamp) = timestamp
... es más de un año después, pero podría ayudar a alguien Para seleccionar todas las consultas a partir de la última
SELECT *
FROM rpc_responses
ORDER BY timestamp DESC