Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL таблица и извличане на данни

Така ще получите желания резултат.

;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

Съществуват обаче редица проблеми със схемата и общите параметри на заявката:

1) Всички колони са varchar. Това е много неефективно, защото всички те трябва да бъдат преобразувани в съответните им типове данни, за да получите желаните от вас резултати. Използвайте datetime, int, float и т.н. (Използвах CTE, за да изчистя заявката според предложението на @Jeroen-Mostert)

2) Когато таблицата стане по-голяма, тази заявка ще започне да се представя много слабо, тъй като използваният предикат (10-секундното времево клеймо) не е индексирано правилно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете съхранена процедура в SQL Server

  2. Пъзел с безизходица:Жертвата не притежава никакъв ресурс, използван за убийство за разрешаване на безизходица

  3. Защо логическите показания за прозоречни агрегатни функции са толкова високи?

  4. Могат ли да се прилагат скаларни функции преди филтриране при изпълнение на SQL оператор?

  5. Относно Sql профилирането