Dette vil få det resultat, du ønsker.
;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
Der er dog en række problemer med skemaet og de generelle forespørgselsparametre:
1) Søjlerne er alle varchars. Dette er meget ineffektivt, fordi de alle skal castes til deres passende datatyper for at få de resultater, du ønsker. Brug datetime, int, float osv. (Jeg har brugt en CTE til at rydde op i forespørgslen i henhold til @Jeroen-Mosterts forslag)
2) Efterhånden som tabellen bliver større, vil denne forespørgsel begynde at yde meget dårligt, da det anvendte prædikat (tidsstemplet på 10 sekunder) ikke er indekseret korrekt.