2017-10-04 12 views
1

我有一個SQL表看起來像下面的一些數據:如何查詢SQL記錄並將列數據包括在附加行中?

TIMESTAMP SYMBOL PRICE VOLUME RATIO ITERATION 
2017-10-04 ABC  1.23 12  0.78 1 
2017-10-05 ABC  1.33 10  0.49 2 
2017-10-06 ABC  1.73 10  0.69 3 
2017-10-04 XYZ  1.73 10  0.69 1 
... 

我想寫一個查詢,將返回所有的記錄匹配timestampsymbol(使用簡單WHERE條款) ,但是也是包括之前的price從當前記錄以前的iteration

例如,如果我想返回所有匹配symbol=ABCtimestamp=2017-10-06記錄,查詢將返回:

TIMESTAMP SYMBOL PRICE VOLUME RATIO ITERATION PREV_PRICE 
2017-10-06 ABC  1.73 10  0.69 3   1.33 

其中PREV_PRICE是匹配symbol=ABCiteration=2(當前記錄迭代值減去記錄的price 1)。

我可以通過代碼通過執行幾個查詢和循環來做到這一點,但我希望能夠在SQL本身中找到一種方法。

從查詢記錄中匹配相同symbol的先前迭代記錄中檢索price數據是可能的嗎?

+0

用你正在使用的數據庫標記你的問題。 –

回答

2

大多數數據庫都支持ANSI標準lag()。但是你必須要小心,因爲你需要過濾之前做lag()

select t.* 
from (select t.*, 
      lag(t.price) over (partition by symbol order by timestamp) as prev_price 
     from t 
     where t.symbol = 'ABC' 
    ) t 
where t.timestamp = '2017-10-06'; 

與過濾symbol子查詢是安全的,因爲那是用來劃分。但是,timestamp上的篩選器需要位於外部查詢中,因此lag()才能完成其工作。

+0

令人驚歎。我沒有聽說過'lag()'。它超級有用。而對於其他讀者,我正在使用MS SQL(在Azure上)。它支持'lag()'沒問題。 – Brett

1

您需要做的就是使用您在問題中列出的標準將表加入自己。這應該工作:

SELECT t1.*, t2.PRICE as PREV_PRICE 
FROM my_table t1 
    LEFT JOIN my_table t2 ON (t2.SYMBOL = t1.SYMBOL AND t2.ITERATION = (t1.ITERATION - 1)) 
WHERE t1.TIMESTAMP = '2017-10-06' 
    AND t1.SYMBOL = 'ABC' 

你也可以做同樣的使用子查詢:

SELECT t1.*, 
    (SELECT PRICE FROM my_table t2 WHERE t2.ITERATION = (t1.ITERATION - 1)) AS PREV_PRICE 
FROM my_table t1 
WHERE t1.TIMESTAMP = '2017-10-06' 
    AND t1.SYMBOL = 'ABC' 
0

包含一個子查詢,以獲得以前的價格。獲取時間戳的最大價格小於給定的時間戳。這將給出與之前時間戳相對應的價格。

SELECT y1.*, 
     (SELECT max (price) 
     FROM yourtable y 
     WHERE symbol = 'ABC' 
      AND timestamp < '2017-10-06') prev_price 
    FROM yourtable y1 
WHERE symbol = 'ABC' 
    AND timestamp = '2017-10-06' 
相關問題