выбор на основе предыдущего значения строки

0

Мне нужно выбрать все объекты, у которых реквизиты были изменены с 4 до 5.

Example:
T1 (It is action log table)

entity      dt            prop
4           2017-03-01    0
4           2017-03-02    1  
4           2017-03-03    4
4           2017-03-04    5
4           2017-03-05    1
4           2017-03-06    1
4           2017-03-07    1

Теперь я делаю это со сценарием. Сначала я выбираю объекты (и их dt), которые имеют prop = 5, затем выбирают предыдущую запись (на основе dt) для каждой сущности, а если prop - 4, тогда объект включается для отчета.

Можно ли сделать в одном SQL-запросе?

Теги:

2 ответа

0
Лучший ответ

Один метод использует коррелированный подзапрос:

select entity
from (select t.*,
             (select t2.prop
              from t t2
              where t2.entity = t.entity and t2.dt < t.dt
              order by t2.dt desc
              limit 1
             ) as prev_prop
      from t
      where prop = 5
     ) t
where prev_prop = 4;

Если вы хотите, вы можете использовать расширение MySQL из having устранить внешний запрос:

select t.*,
       (select t2.prop
        from t t2
        where t2.entity = t.entity and t2.dt < t.dt
        order by t2.dt desc
        limit 1
       ) as prev_prop
from t
where prop = 5
having prev_prop = 4;

Примечание: могут быть более эффективные способы реализации этого. Например, если каждый объект имеет не более 4 и один 5, и между ними нет другого реквизита, вы можете сделать следующее:

select entity
from t
group by entity
having max(case when prop = 4 then dt end) < max(case when prop = 4 then dt end);
0

Используйте самоподключение:

SELECT a.*
FROM T1 AS a
JOIN T1 AS b ON a.entity = b.entity AND a.dt = DATE_ADD(b.dt, INTERVAL 1 DAY) 
WHERE a.prop = 5 AND b.prop = 4

Ещё вопросы

Сообщество Overcoder
Наверх
Меню