sql >> Databáze >  >> RDS >> Sqlserver

SQL tabulka a extrakce dat

Tím dosáhnete požadovaného výsledku.

;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

Existuje však řada problémů se schématem a obecnými parametry dotazu:

1) Všechny sloupce jsou varchary. To je velmi neefektivní, protože všechny je třeba přetypovat na příslušné datové typy, aby se dosáhlo požadovaných výsledků. Použijte datum a čas, int, float atd. (Použil jsem CTE k vyčištění dotazu podle návrhu @Jeroen-Mostert)

2) Jak se tabulka zvětšuje, tento dotaz začne fungovat velmi špatně, protože použitý predikát (časové razítko 10 sekund) není správně indexován.



  1. Data by měla být nahrazena podle vyhledávací tabulky

  2. Kontingenční tabulka / kontingenční tabulka s více než jedním sloupcem hodnot

  3. Vyhledejte jméno v cx_Oracle

  4. Selhání úlohy SSIS, když maska ​​pro výběr souborů k nahrání na FTP server pomocí WinSCP neodpovídá žádnému souboru