Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Tabela SQL i ekstrakcja danych

Dzięki temu uzyskasz pożądany rezultat.

;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

Istnieje jednak szereg problemów ze schematem i ogólnymi parametrami zapytania:

1) Wszystkie kolumny to varchary. Jest to bardzo nieefektywne, ponieważ wszystkie muszą być rzutowane na odpowiednie typy danych, aby uzyskać pożądane wyniki. Użyj datetime, int, float itp. (Użyłem CTE do oczyszczenia zapytania zgodnie z sugestią @Jeroen-Mostert)

2) W miarę powiększania się tabeli zapytanie to zacznie działać bardzo słabo, ponieważ użyty predykat (znacznik czasu 10 sekund) nie jest prawidłowo indeksowany.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Excel do SQL Server z Microsoft.ACE.OLEDB.12.0

  2. DateTime2 vs DateTime w SQL Server

  3. SSIS — Wykonywanie wyszukiwania w innej tabeli w celu uzyskania powiązanej kolumny

  4. Popraw wydajność zapytań SQL Server na dużych tabelach

  5. PHP MsSQL PDO lub API