Yes, you can use LEAD / LAG. You just need to pre-calculate how far you can jump with little magic ROW_NUMBER ().
DECLARE @a TABLE ( number int, price money, type varchar(2), date date, time time) INSERT @a VALUES (23456,0.665,'SV','2014/02/02','08:00:02'), (23457,1.3 ,'EC','2014/02/02','07:50:45'), (23658,2.4 ,'EC','2014/02/02','07:50:45'), (23660,2.4 ,'EC','2014/02/02','07:50:48'), (23465,0.668,'SV','2014/02/02','07:36:34'); ; WITH a AS ( SELECT *, ROW_NUMBER() OVER(ORDER BY [date] DESC, [time] DESC) x, ROW_NUMBER() OVER(PARTITION BY CASE [type] WHEN 'SV' THEN 1 ELSE 0 END ORDER BY [date] DESC, [time] DESC) y FROM @a) , b AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY xy ORDER BY x ASC) z1, ROW_NUMBER() OVER(PARTITION BY xy ORDER BY x DESC) z2 FROM a) SELECT *, CASE [type] WHEN 'SV' THEN LAG(price,z1,price) OVER(PARTITION BY [type] ORDER BY x) ELSE LAG(price,z1,price) OVER(ORDER BY x) END, CASE [type] WHEN 'SV' THEN LEAD(price,z2,price) OVER(PARTITION BY [type] ORDER BY x) ELSE LEAD(price,z2,price) OVER(ORDER BY x) END FROM b ORDER BY x