Điều này sẽ nhận được kết quả bạn muốn.
;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
Tuy nhiên, có một số vấn đề với lược đồ và các tham số truy vấn chung:
1) Các cột đều là varchars. Điều này rất kém hiệu quả vì tất cả chúng đều cần được chuyển sang kiểu dữ liệu thích hợp để có được kết quả bạn mong muốn. Sử dụng datetime, int, float, v.v. (Tôi đã sử dụng CTE để xóa truy vấn theo đề xuất của @ Jeroen-Mostert)
2) Khi bảng lớn hơn, truy vấn này sẽ bắt đầu hoạt động rất kém vì vị từ được sử dụng (dấu thời gian 10 giây) không được lập chỉ mục đúng cách.