2008-12-09 6 views
3

J'ai les attributs suivants dans ma base de données.Mysql requête pour obtenir 2 plus récent pour un numéro d'article donné

id, nom de périphérique, valeur, horodatage.

Pour une statistique donnée, je souhaite trouver les 2 horodatages les plus récents et les valeurs correspondantes pour chaque périphérique unique.

J'essaie des choses comme

Essai 1)

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

Cela me donne les 2 premiers horodateurs, mais pas par appareil.

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

Mais qui ne fonctionne pas trop bien non plus ..

Fondamentalement, je veux que les 2 plus récentes horodatages avec des valeurs pour chaque dispositif, pour une statistique donnée .. toute aide est vraiment apprécié :)

Répondre

2

Voici comment je résoudre ce type de problème:

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 d'autres termes, affichez les lignes de telle sorte qu'il y ait moins de deux autres lignes avec les mêmes statistic et devicename et une plus grande (plus récente) timestamp.

Je suppose que vous n'aurez pas de doublons dans la colonne timestamp pour une statistique donnée & devicename.

+0

Cela ne fonctionnera que dans MySQL. D'autres SGBDR vous diront que vous ne pouvez pas regrouper seulement une partie des déclarations sélectionnées et que vous devez regrouper par tous les quatre. – mat

+0

Et la question concerne MySql –

1

Essayez quelque chose comme:

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) 

(peut ne pas fonctionner dans le vieux MySQL bien)

1

J'ai testé la requête suivante sur mon système wid une table de démonstration comme la vôtre et cela fonctionne. J'ai considéré orgtime au lieu de timestamp .. vous pouvez faire la même chose (juste changement de nom requis)

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 
Questions connexes