consulta de mysql para obter 2 mais recente para um determinado número de item

votos
3

Eu tenho os seguintes atributos no meu DB.

ID de estatística, devicename, valor, data e hora.

Para um dado estatístico, eu quero encontrar as 2 marcas de tempo mais recentes e valores corresopnding para um dispositivo de cada único.

Eu estou tentando coisas como

Experimento 1)

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

Isto dá-me o top 2 timestamps, mas não por dispositivo.

Ensaio 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;

Mas isso não está funcionando muito bem quer ..

Basicamente, eu quero as 2 marcas de tempo mais recentes com valores para cada dispositivo, para um dado estatístico .. qualquer ajuda é muito apreciada :)

Publicado 10/12/2008 em 00:58
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

Isto é como eu resolver 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;

Em outras palavras, mostram as linhas de modo a que existam menos do que duas outras linhas com o mesmo statistice devicenamee uma maior (mais recente) timestamp.

Estou assumindo que você não terá duplicatas na timestampcoluna para uma determinada estatística & devicename.

Respondeu 10/12/2008 em 01:12
fonte usuário

votos
1

Eu testei a seguinte consulta no meu sistema wid uma mesa de demonstração como a sua e ele funciona. Tenho considerado orgtime vez de timestamp .. você pode fazer o mesmo (apenas o nome mudança necessária)

    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
Respondeu 10/12/2008 em 10:22
fonte usuário

votos
1

Tente 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)

(Não pode trabalhar em MySQL velha embora)

Respondeu 10/12/2008 em 09:38
fonte usuário

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