Вы можете использовать этот метод, который находит последний идентификатор, где Позиция равна 3, и получает две строки, предшествующие этому. Это предполагает, что Позиция является последовательной, как в данных образца.
declare @table table (ID int identity(1,1), Position int)
insert into @table
values
(1),(2),(3),(1),(2),(3),(1),(2)
select top 3
*
from @table
where ID <=(
select max(ID)
from @table
where Position = 3)
order by ID desc
Или вы можете сделать это с AND
в вашем предложении WHERE
. Я бы сохранил идентификатор как переменную, поэтому вам нужно будет выполнить агрегацию только один раз.
declare @id int = ( select max(ID)
from @table
where Position = 3)
select *
from @table
where ID <= @id
and ID >= @id - 2
order by ID