Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Tabella SQL ed estrazione dati

Questo otterrà il risultato che desideri.

;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

Tuttavia, ci sono una serie di problemi con lo schema e i parametri generali della query:

1) Le colonne sono tutte varchar. Questo è molto inefficiente perché tutti devono essere trasmessi ai tipi di dati appropriati per ottenere i risultati desiderati. Usa datetime, int, float ecc. (Ho usato un CTE per ripulire la query secondo il suggerimento di @Jeroen-Mostert)

2) Man mano che la tabella diventa più grande, questa query inizierà a funzionare molto male poiché il predicato utilizzato (il timestamp di 10 secondi) non è indicizzato correttamente.