Фильтр по предыдущему значению из этой же таблицы в sql выборке

Есть 2 таблицы, допустим:

group (id, name)

value (id, group_id, val, date)

Нужно получить все строчки из таблицы value, у которых в предшествующей строке значение val меньше чем у текущей.

Пример:

[id: 1, group_id: 1, val: 150, date: 2020-17-02]
[id: 2, group_id: 1, val: 200, date: 2020-17-03]
[id: 3, group_id: 2, val: 111, date: 2020-17-02]
[id: 4, group_id: 1, val: 500, date: 2020-17-01]

после sql запроса, должна выбраться строчка с id = 2, т.к. значение val = 150 (id=1) меньше чем val = 200 (id=2) и в id = 3 (т.к. больше нет записей с group_id = 2)

то есть, грубо говоря, нужно сделать сортировку ORDER BY date DESC, пройтись по всем строчкам, и если есть такая, у которой найдена строчка с той же group_id и датой, меньше чем в текущей строке, то вернуть в результате эту строчку

пробовал сделать примерно так:

SELECT * FROM value v1 ... AND WHERE EXISTS (SELECT * FROM value v2 WHERE v1.group_id = v2.group_id AND v1.id != v2.id AND v1.value > v2.value ORDER BY date DESC limit 1)

и это работает, если у каждой группы по 2 значения в values, а если больше, то нет вероятности, что найденная внутри EXISTS строка будет именно предшествующей перед текущей

надеюсь всё понятно объяснил, всем заранее спасибо


Ответы (1 шт):

Автор решения: Yaroslav

можно так попробывать:

with 
  g as (select
          lag(x.id) over(order by x.id) as id,
          lag(x.group_id) over(order by x.id) as group_id,
          lag(x.val) over(order by x.id) as val,
          lag(x.dat) over(order by x.id) as dat
        from Value x),
  v as (select * from Value v)

select v.* from v, g
  where v.group_id = g.group_id 
    and v.id != g.id 
    and v.val > g.val 
    and v.dat > g.dat
  order by v.id;

Результат:

введите сюда описание изображения

→ Ссылка