Така ще получите желания резултат.
;with cast_cte
as
(
select [TRADE_ID], cast([TIMESTAMP] as datetime) timestamp, [SECURITY], [QUANTITY], cast([PRICE] as float) as price
from tbProduct
)
select t1.trade_id, t2.trade_id, datediff(ms, t1.timestamp, t2.timestamp) as milliseconds_diff,
((t1.price - t2.price) / t1.price) * 100 as price_diff
from cast_cte t1
inner join cast_cte t2
on datediff(ms, t1.timestamp, t2.timestamp) between 0 and 10000
and t1.trade_id <> t2.trade_id
where ((t1.price - t2.price) / t1.price) * 100 > 10
or ((t1.price - t2.price) / t1.price) * 100 < -10
Съществуват обаче редица проблеми със схемата и общите параметри на заявката:
1) Всички колони са varchar. Това е много неефективно, защото всички те трябва да бъдат преобразувани в съответните им типове данни, за да получите желаните от вас резултати. Използвайте datetime, int, float и т.н. (Използвах CTE, за да изчистя заявката според предложението на @Jeroen-Mostert)
2) Когато таблицата стане по-голяма, тази заявка ще започне да се представя много слабо, тъй като използваният предикат (10-секундното времево клеймо) не е индексирано правилно.