Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Tabela SQL e extração de dados


Isso obterá o resultado desejado.
;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

No entanto, há vários problemas com o esquema e os parâmetros gerais de consulta:

1) As colunas são todas varchars. Isso é muito ineficiente porque todos eles precisam ser convertidos em seus tipos de dados apropriados para obter os resultados desejados. Use datetime, int, float etc. (eu usei um CTE para limpar a consulta conforme a sugestão de @Jeroen-Mostert)

2) À medida que a tabela aumenta, essa consulta começará a ter um desempenho muito ruim, pois o predicado usado (o carimbo de data/hora de 10 segundos) não está indexado corretamente.