MySQL sorgusu verilen bir madde numarası için 2 En son olsun

oy
3

Benim DB aşağıdaki özelliklere sahiptir.

istatistik kimliği, aygitadi, değer, zaman damgası.

Verilen bir istatistik için, bir her benzersiz cihaz için 2 En son zaman damgaları ve corresopnding değerleri bulmak istiyoruz.

Ben böyle şeyler çalışıyorum

Deneme 1)

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

Bu ancak cihaz başına, bana üst 2 damgalarını verir.

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

Ama bu da çok iyi durumda olmayanları ..

Temelde, her bir cihaz için değerlerle 2 En son damgaları istiyorum, belirli bir istatistik için .. herhangi bir yardım gerçekten takdir :)

Oluştur 10/12/2008 saat 00:58
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
2

Bu benim bu tür bir sorunu çözmek nasıl:

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;

Diğer bir deyişle, aynı ile ikiden az diğer satırlar vardır öyle ki satırlarını gösterir statisticve devicenameve daha büyük bir (daha yeni) timestamp.

Sana çiftleri olmayacağını farz ediyorum timestamp, belirli bir istatistik ve DEVICENAME cihazınıza için sütunda.

Cevap 10/12/2008 saat 01:12
kaynak kullanıcı

oy
1

Seninki gibi bir demo tablo wid sistemimde aşağıdaki sorguyu test ve çalışıyor. Sana da aynı şeyi yapabilirsiniz .. yerine damgası orgtime kabul var (sadece değişikliği gerekli NAME)

    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
Cevap 10/12/2008 saat 10:22
kaynak kullanıcı

oy
1

Böyle bir şey deneyin:

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)

(Gerçi eski MySQL çalışmayabilir)

Cevap 10/12/2008 saat 09:38
kaynak kullanıcı

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