2014-02-13 48 views
0

我有兩個股票交易相關的盤中表:如何聯合兩個表,並提取第一個記錄

  1. 最佳買賣數量與時間戳問
  2. 貿易表,交易價格和數量

例(只是一個假象,價格和數量):

貿易表

char, char, integer, number, number 

Ticker time, milliseconds price qty 
MSFT 09:10:02  800   23.45 10 
MSFT 09:10:02  900   23.45 5 
MSFT 09:10:06  600   23.42 1 

最優報價表問

char, char, integer, number, number, number, number 

Ticker time milliseconds  bid bid_qty ask ask_qty 
MSFT 09:10:02  850   23.42 50  23.45 4 
MSFT 09:10:02  930   23.44 50  23.45 1 
MSFT 09:10:02  980   23.41 49  23.45 1 
MSFT 09:10:06  600   23.42 45  23.43 2 
MSFT 09:10:06  700   23.42 25  23.43 2 
MSFT 09:10:06  710   23.41 20  23.43 2 

問題:貿易時間戳開始,我想找到的第一個後續的最佳買入最好問紀錄這筆交易提出後。換句話說:這次交易導致下一筆訂單狀況。

合適的SQL語句應該如何顯示?

重要:

  • 交易表中的記錄遠遠低於最佳買入賣出記錄
  • 時間被格式化爲charakter,毫秒都存儲在一個單獨的列整數
  • 時間戳(時間+毫秒)的最佳出價最佳詢問可以與交易或幾毫秒後的相同(但不更早!)。

所以在我上面的例子,我需要有以下連接查詢結果:

Ticker time milliseconds price qty ba_time ba_milliseconds bid bid_qty ask ask_qty 
MSFT 09:10:02 800  23.45 10 09:10:02  850  23.42 50 23.45 4 
MSFT 09:10:02 900  23.45 5 09:10:02  930  23.44 50 23.45 1 
MSFT 09:10:06 600  23.42 1 09:10:06  600  23.42 45 23.43 2 

謝謝!

+0

表上沒有PK,FK約束,禮儀? –

+0

是的,正確的,不幸的是我的表中沒有PK/FK,我需要比較時間戳 – user1766682

回答

0

SQL Fiddle

with trade as (
    select 
     ticker, 
     format('%s.%s', "time", milliseconds)::time(3) as "time", 
     price, 
     qty 
    from trade 
), bba as (
    select 
     ticker, 
     format('%s.%s', "time", milliseconds)::time(3) as "time", 
     bid, 
     bid_qty, 
     ask, 
     ask_qty 
    from bba 
) 
select distinct on (rn) 
    t.ticker, t.time, t.price, t.qty, 
    b.time as ba_time, b.bid, b.bid_qty, b.ask, b.ask_qty 
from 
    (
     select *, 
      row_number() over(order by "time") as rn 
     from trade 
    ) t 
    inner join 
    bba b on t.ticker = b.ticker and t."time" <= b."time" 
order by rn, b.time 

您將需要一天的時間戳記,如果表將有超過一天。

相關問題