Вы можете использовать функции окна:
select ref_id, data data_1, lead_data data2
from (
select
t.*,
lead(flag) over(partition by ref_id order by flag, orn) lead_flag,
lead(data) over(partition by ref_id order by flag, orn) lead_data
from mytable t
) t
where
flag = 0 and lead_flag = 1
or (flag = 1 and lead_flag = 1)
or (flag = 1 and lead_flag = 2)
order by ref_id, flag, orn
Демонстрация на DB Fiddle :
REF_ID | DATA_1 | DATA2
-----: | -----: | ----:
1 | 400 | 110
1 | 110 | 210
1 | 210 | 150
2 | 800 | 120
2 | 120 | 220
2 | 220 | 320
2 | 320 | 420
2 | 420 | 170
Обратите внимание, что для этого набора данных, предложение where
можно упростить как:
where 1 in (flag, lead_flag)