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 )

más reciente
¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top