Cela donnera le résultat que vous voulez.
;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
Cependant, il existe un certain nombre de problèmes avec le schéma et les paramètres généraux de requête :
1) Les colonnes sont toutes des varchars. Ceci est très inefficace car ils doivent tous être convertis en leurs types de données appropriés afin d'obtenir les résultats souhaités. Utilisez datetime, int, float etc. (j'ai utilisé un CTE pour nettoyer la requête selon la suggestion de @ Jeroen-Mostert)
2) Au fur et à mesure que la table s'agrandit, cette requête commencera à très mal fonctionner car le prédicat utilisé (l'horodatage de 10 secondes) n'est pas indexé correctement.