Ini akan mendapatkan hasil yang Anda inginkan.
;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
Namun, ada sejumlah masalah dengan skema dan parameter kueri umum:
1) Semua kolom adalah varchars. Ini sangat tidak efisien karena mereka semua harus dilemparkan ke tipe data yang sesuai untuk mendapatkan hasil yang Anda inginkan. Gunakan datetime, int, float dll. (Saya telah menggunakan CTE untuk membersihkan kueri sesuai saran @ Jeroen-Mostert)
2) Saat tabel semakin besar, kueri ini akan mulai berkinerja sangat buruk karena predikat yang digunakan (stempel waktu 10 detik) tidak diindeks dengan benar.