sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-tabell och dataextraktion

Detta kommer att få det resultat du vill ha.

;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

Det finns dock ett antal problem med schemat och allmänna frågeparametrar:

1) Kolumnerna är alla varchar. Detta är mycket ineffektivt eftersom de alla måste gjutas till sina lämpliga datatyper för att få de resultat du önskar. Använd datetime, int, float etc. (Jag har använt en CTE för att rensa upp frågan enligt @Jeroen-Mosterts förslag)

2) När tabellen blir större kommer denna fråga att börja fungera mycket dåligt eftersom predikatet som används (10 sekunders tidsstämpel) inte är korrekt indexerat.



  1. Hur avgör jag om jag har oengagerade skrivningar i en MySQL-transaktion?

  2. Spring Data med Mysql JSON-typ

  3. SQL-fråga för att ta bort tabell i MySQL

  4. Använd OBJECTPROPERTY() för att ta reda på om ett objekt är en CHECK-begränsning i SQL Server