Q:

Select pegando linha anterior

O que tenho que usar no SQL SERVER 2008 para pegar a linha anterior a uma determinada clausura.  Por exemplo se no meu where abaixo se o alerta for = a 99 quero saber o alerta e a velocidade anterior ao alerta. 
Speed     Data                  Alerta
58   '2017-09-13 10:08:04.290'  44
20   '2017-09-13 10:08:51.340'  99
56   '2017-09-13 10:09:21.450'  204
40   '2017-09-13 10:09:27.470'  99
34   '2017-09-13 10:09:37.570'  204

Neste exemplo houve dois alerta 99 onde ele estava a uma velocidade de 20 e 40 km, quero retornar esta linha anterior ao alerta com a maior velocidade:
Speed     Data                  Alerta
56   '2017-09-13 10:09:21.450'  204 

A:

Um pouco grande, mas resolve seu problema..
declare @Velocidades table
(
    Speed int,
    Data Datetime,
    Alerta int
);

insert into @Velocidades  values
(58,'2017-09-13 10:08:04.290',44),
(20,'2017-09-13 10:08:51.340',99),
(56,'2017-09-13 10:09:21.450',204),
(40,'2017-09-13 10:09:27.470',99),
(34,'2017-09-13 10:09:37.570',204)

declare @VelocidadesTeste table
(
    Speed int,
    Data Datetime,
    Alerta int
);

DECLARE @Speed int, @Data Datetime, @Alerta int;  

DECLARE db_cursor CURSOR FOR  
    SELECT Speed, Data, Alerta
    FROM @Velocidades
    WHERE Alerta = 99; 

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @Speed, @Data, @Alerta   

WHILE @@FETCH_STATUS = 0   
BEGIN   
       insert into @VelocidadesTeste
       select top 1 * from @Velocidades 
       where Data < @Data 
       order by Data desc;

       FETCH NEXT FROM db_cursor INTO @Speed, @Data, @Alerta   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

select * from @VelocidadesTeste
where Speed = (select max(Speed) from @VelocidadesTeste)

