SQL запрос для получения изменения значения

Вот что я пытаюсь получить из БД: введите сюда описание изображения

Мне нужно вернуть строку, в момент изменения значения на 1, и строку перед изменением значения на 0 (выделено зелёным). X следующей строки не обязательно больше предыдущей на 1.

Написал примерный код:

SELECT *
FROM (
SELECT * LAG(y) OVER (ORDER BY id) as prev_val
FROM table WHERE y = 1 OR y = 0
) t
WHERE y <> prev_val

Но, к сожалению это не то, что я хотел бы. Идеи?


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

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

Создадим таблицу с вашими данными.

CREATE TABLE your_table_name (
    x NUMBER,
    y NUMBER
);

Наполним её данными.

INSERT ALL
    INTO your_table_name (x, y) VALUES (0, 0)
    INTO your_table_name (x, y) VALUES (2, 0)
    INTO your_table_name (x, y) VALUES (4, 0)
    INTO your_table_name (x, y) VALUES (10, 1)
    INTO your_table_name (x, y) VALUES (12, 1)
    INTO your_table_name (x, y) VALUES (15, 0)
    INTO your_table_name (x, y) VALUES (100, 1)
    INTO your_table_name (x, y) VALUES (200, 0)
    INTO your_table_name (x, y) VALUES (1000, 1)
SELECT * FROM dual;

А затем выполним следующий запрос, который вернёт значения до измненения и после (используйте нужное для вас в контексте)

with cte_table as ( --инициализируем ROWNUM как row_number (работает в oracle)
SELECT x, y, ROWNUM AS row_number
FROM your_table_name
ORDER BY x)
select t1.x,t1.y,
       t2.x,t2.y
  from cte_table t1
join cte_table t2 on
t1.row_number = t2.row_number+1 -- используем
where t1.y <> t2.y;

Результат

X Y X Y
10 1 4 0
15 0 12 1
100 1 15 0
200 0 100 1
1000 1 200 0

P.S.

Вы можете менять оператор в where t1.y <> t2.y, для получения моментов перепрыгивания с 0 на 1 (оператор >) или с 1 на 0 (оператор <)

→ Ссылка
Автор решения: Akina
SELECT *
FROM test t1
JOIN test t2 ON t1.x < t2.x AND t1.y <> t2.y
WHERE NOT EXISTS ( SELECT NULL
                   FROM test t3
                   WHERE t1.x < t3.x
                     AND t3.x < t2.x                              
                   );

Если словами: найти такие точки, что первая раньше второй, значения в них различны, и между ними нет других точек.

Работает практически на любой версии любого диалекта.

→ Ссылка