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 шт):
Создадим таблицу с вашими данными.
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 (оператор <)
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
);
Если словами: найти такие точки, что первая раньше второй, значения в них различны, и между ними нет других точек.
Работает практически на любой версии любого диалекта.