Выберите отдельные последние 2 строки на основе столбца метки времени - PullRequest
0 голосов
/ 12 января 2019

У меня есть таблица, как показано ниже. Я хочу извлечь последние (по времени) 2 строки с одинаковым идентификатором. Если строки не совпадают, ничего не возвращайте. Затем вычтите значения самой последней строки со второй самой последней и верните таблицу с идентификатором и значением результата.

Ниже таблица. 1-й столбец - это идентификатор. Второе значение, третье время. Идентификатор не является первичным или уникальным

Id value  time
3   2   2019-01-11 18:59:07.403
2   7   2019-01-10 18:58:40.400
4   5   2019-01-12 18:58:42.400
2   2   2019-01-11 18:59:23.147
5   -5  2019-01-12 18:58:42.400
3   8   2019-01-12 18:59:27.670
2   5   2019-01-12 18:59:43.777

Результат должен быть

id  value
2   3
3   6

Ответы [ 2 ]

0 голосов
/ 12 января 2019

В MySQL 8+ вы можете использовать оконные функции и условное агрегирование

select t.id,
       sum(case when seqnum = 1 then value else - value end) as diff
from (select t.*,
             row_number() over (partition by id order by time desc) as seqnum             
      from elbat t
     ) t
where seqnum in (1, 2)
group by id
order by max(time) desc
limit 2;

Эту же идею можно адаптировать к более ранним версиям, используя переменные:

select t.id,
       sum(case when seqnum = 1 then value else - value end) as diff
from (select t.*,
             (@rn := if(@i = id, @rn + 1,
                        if(@i := id, 1, 1)
                       )
             )  as seqnum             
      from (select t.* from elbat t order by id, time desc) t cross join
           (select @i := -1, @rn := 0) params
     ) t
where seqnum in (1, 2)
group by id
order by max(time) desc
limit 2;
0 голосов
/ 12 января 2019

Одно из возможных решений использует агрегацию для получения идентификаторов, которые встречаются более одного раза, и коррелирует подзапросы с ORDER BY и LIMIT, чтобы получить самое последнее и второе самое последнее значение.

SELECT x.id,
       (SELECT t.value
               FROM elbat t
               WHERE t.id = x.id
               ORDER BY t.time DESC
               LIMIT 0, 1)
       -
       (SELECT t.value
               FROM elbat t
               WHERE t.id = x.id
               ORDER BY t.time DESC
               LIMIT 1, 1) value
       FROM (SELECT t.id
                    FROM elbat t
                    GROUP BY t.id
                    HAVING count(*) > 1) x;

дб <> скрипка

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