Hiermee krijgt u het gewenste resultaat.
;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
Er zijn echter een aantal problemen met het schema en de algemene queryparameters:
1) De kolommen zijn allemaal varchars. Dit is erg inefficiënt omdat ze allemaal naar de juiste gegevenstypen moeten worden gegoten om de gewenste resultaten te krijgen. Gebruik datetime, int, float etc. (ik heb een CTE gebruikt om de query op te schonen volgens de suggestie van @Jeroen-Mostert)
2) Naarmate de tabel groter wordt, zal deze zoekopdracht zeer slecht gaan presteren omdat het gebruikte predikaat (de tijdstempel van 10 seconden) niet correct is geïndexeerd.