Используйте lag()
:
select t.*
from (select t.*,
lag(col3) over (order by col1) as prev_col3
from t
) t
where not (prev_col3 = 'IN' and col3 = 'IN') or
prev_col3 is null
Если вы действительно хотите удалить записей (что я не рекомендую), вы можете включить эту логику в delete
:
with todelete as (
select t.*,
lag(col3) over (order by col1) as prev_col3
from t
)
delete from todelete
where prev_col3 = 'IN' and col3 = 'IN';
РЕДАКТИРОВАТЬ:
В старых, неподдерживаемых версиях SQL Server вы можете использовать коррелированный подзапрос:
select t.*
from (select t.*,
(select top (1) t2.col3
from t t2
where t2.col1 < t.col1
order by t2.col1 desc
) as prev_col3
from t
) t
where not (prev_col3 = 'IN' and col3 = 'IN') or
prev_col3 is null