Consulta Mysql para obtener 2 más recientes para un número de artículo dado

votos
3

Tengo los siguientes atributos en mi DB.

ID de estadística, nombre de dispositivo, valor, marca de tiempo.

Para una estadística determinada, quiero encontrar los 2 valores de fecha y hora más recientes para cada dispositivo único.

Estoy intentando cosas como

Prueba 1)

select statistic, devicename, value, timestamp
from X_STATSVALUE
where statistic=19
order by orgtime DESC limit 2;

Esto me da los 2 mejores sellos de tiempo, pero no por dispositivo.

Prueba 2)

select statistic, devicename, value, timestamp
from X_STATSVALUE as x 
where x.statistic=241
  and (select count(*)
       from X_STATSVALUE as y
       where y.statistic=x.statistic
         and y.device=x.device
         and y.timestamp > x.timestamp) <=1;

Pero eso tampoco está funcionando bien ...

Básicamente, quiero las 2 marcas de tiempo más recientes con valores para cada dispositivo, para una estadística dada ... cualquier ayuda es realmente apreciada :)

Publicado el 10/12/2008 a las 00:58
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
2

Así es como resuelvo este tipo de problema:

SELECT x.statistic, x.devicename, x.value, x.timestamp
FROM X_STATSVALUE AS x
  LEFT OUTER JOIN X_STATSVALUE AS x2
    ON (x.statistic = x2.statistic 
    AND x.devicename = x2.devicename 
    AND x.timestamp < x2.timestamp)
GROUP BY x.statistic, x.devicename
HAVING COUNT(*) < 2;

En otras palabras, mostrar las filas de tal manera que hay otras menos de dos filas con el mismo statisticy devicenamey una mayor (más reciente) timestamp.

Supongo que no tendrá duplicados en la timestampcolumna para una estadística y un nombre de dispositivo determinados.

Respondida el 10/12/2008 a las 01:12
fuente por usuario

votos
1

Probé la siguiente consulta en mi sistema con una tabla de demostración como la tuya y funciona. He considerado orgtime en lugar de timestamp. Puedes hacer lo mismo (solo necesitas cambiar el nombre)

    select t1.statistic, devicename, value, timestamp from X_STATSVALUE as t1 

    inner join 

    ( select statistic, max(orgtime) as orgtime from X_STATSVALUE group by statistic ) 
as t2 

    on t1.statistic = t2.statistic and t1.orgtime = t2.orgtime

    UNION

    select tb1.statistic, tb1.devicename, tb1.value, tb1.timestamp
    from X_STATSVALUE as tb1 inner join 

    ( select statistic, max(orgtime) as orgtime from X_STATSVALUE  WHERE statistic+orgtime not in 
    (select t1.statistic+t1.orgtime from X_STATSVALUE as t1 inner join 
    ( select statistic, max(orgtime) as orgtime from X_STATSVALUE group by statistic ) 
as t2 on t1.statistic = t2.statistic and t1.orgtime = t2.orgtime
    ) group by statistic 
    ) 

    as tb2 on tb1.statistic = tb2.statistic and tb1.orgtime = tb2.orgtime
Respondida el 10/12/2008 a las 10:22
fuente por usuario

votos
1

Pruebe algo como:

SELECT DISTINCT x.statistic, x.devicename, x.value, x.timestamp
FROM X_STATSVALUE AS x
WHERE x.timestamp IN (SELECT timestamp
                      FROM X_STATSVALUE
                      WHERE devicename = x.devicename AND statistic = x.statistic
                      ORDER BY timestamp LIMIT 2)

(Puede que no funcione en el antiguo MySQL)

Respondida el 10/12/2008 a las 09:38
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more