Mysql запрос, чтобы получить 2 самых последних для данного номера элемента - PullRequest
3 голосов
/ 10 декабря 2008

В моей базе данных есть следующие атрибуты.

идентификатор статистики, имя устройства, значение, метка времени.

Для данной статистики я хочу найти 2 самые последние отметки времени и соответствующие значения для каждого уникального устройства.

Я пытаюсь что-то вроде

Пробная версия 1)

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

Это дает мне две верхние метки времени, но не для каждого устройства.

Пробная версия 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;

Но это тоже не слишком хорошо работает.

В принципе, я хочу получить 2 самые последние отметки времени со значениями для каждого устройства для заданной статистики. Любая помощь действительно приветствуется:)

Ответы [ 3 ]

2 голосов
/ 10 декабря 2008

Вот как я решаю проблему такого типа:

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;

Другими словами, покажите строки так, чтобы было меньше двух других строк с одинаковыми statistic и devicename и большей (более поздней) timestamp.

Я предполагаю, что у вас не будет дубликатов в столбце timestamp для данной статистики и названия устройства.

1 голос
/ 10 декабря 2008

Я проверил следующий запрос в моей системной программе на демонстрационной таблице, подобной вашей, и она работает. Я рассмотрел orgtime вместо отметки времени .. вы можете сделать то же самое (требуется только изменение имени)

    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
1 голос
/ 10 декабря 2008

Попробуйте что-то вроде:

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)

(может не работать в старом MySQL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...