Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Tabelle und Datenextraktion

Dadurch erhalten Sie das gewünschte Ergebnis.

;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

Es gibt jedoch eine Reihe von Problemen mit dem Schema und allgemeinen Abfrageparametern:

1) Die Spalten sind alle Varchars. Dies ist sehr ineffizient, da sie alle in ihre entsprechenden Datentypen umgewandelt werden müssen, um die gewünschten Ergebnisse zu erzielen. Verwenden Sie datetime, int, float usw. (ich habe einen CTE verwendet, um die Abfrage gemäß dem Vorschlag von @Jeroen-Mostert zu bereinigen)

2) Je größer die Tabelle wird, desto schlechter wird diese Abfrage, da das verwendete Prädikat (der 10-Sekunden-Zeitstempel) nicht richtig indexiert ist.