Mysql Abfrage zu erhalten 2 letzten für eine bestimmte Artikelnummer

stimmen
3

Ich habe folgende Attribute in meiner DB.

Statistik-ID, Gerätename, den Wert, Zeitstempel.

Für eine gegebene Statistik möchte ich die zwei jüngsten Zeitstempel und corresopnding Werte für eine jede einzigartige Gerät zu finden.

Ich versuche, Sachen wie

Versuch 1)

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

Das gibt mir den Top-2-Zeitstempel, aber nicht pro Gerät.

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

Aber das ist nicht zu gut entweder arbeiten ..

Grundsätzlich mag ich die zwei jüngsten Zeitstempel mit Werten für jedes Gerät, für eine bestimmte Statistik .. jede Hilfe ist wirklich zu schätzen :)

Veröffentlicht am 10/12/2008 um 00:58
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
2

Dies ist, wie ich diese Art von Problem zu lösen:

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;

Mit anderen Worten zeigen die Reihen , so dass es weniger als zwei weitere Zeilen mit demselben statisticund devicenameund einem größeren (jüngeren) timestamp.

Ich gehe davon aus, dass Sie keine Duplikate in dem haben werden timestampSpalte für eine bestimmte Statistik & Gerätenamen .

Beantwortet am 10/12/2008 um 01:12
quelle vom benutzer

stimmen
1

Getestet habe ich die folgende Abfrage auf meinem System einen Demo-Tisches wie das Ihr wid und es funktioniert. Ich habe statt Zeitstempel als orgtime .. Sie können das gleiche tun (nur Namensänderung erforderlich)

    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
Beantwortet am 10/12/2008 um 10:22
quelle vom benutzer

stimmen
1

Versuchen Sie so etwas wie:

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)

(Nicht jedoch in den alten MySQL arbeiten)

Beantwortet am 10/12/2008 um 09:38
quelle vom benutzer

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