sql >> Base de Datos >  >> RDS >> Sqlserver

Tabla SQL y extracción de datos

Esto obtendrá el resultado que desea.

;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

Sin embargo, hay una serie de problemas con el esquema y los parámetros generales de consulta:

1) Las columnas son todas varchars. Esto es muy ineficiente porque todos deben convertirse en sus tipos de datos apropiados para obtener los resultados que desea. Use datetime, int, float, etc. (He usado un CTE para limpiar la consulta según la sugerencia de @ Jeroen-Mostert)

2) A medida que la tabla crece, esta consulta comenzará a funcionar muy mal ya que el predicado utilizado (la marca de tiempo de 10 segundos) no está indexado correctamente.