我有收盤價的表格債券隨着時間的推移,與基本結構:計數數量/價格無天更換
bond_id | tdate | price
---------+------------+-------
EIX1923 | 2014-01-01 | 100.12
EIX1923 | 2014-01-02 | 100.10
EIX1923 | 2014-01-05 | 100.10
EIX1923 | 2014-01-10 | 100.15
正如你所看到的,我沒有價格因爲債券不會每天交易。 我想指出在某一年發生這種情況的頻率,如果債券價格在連續幾天之間沒有變化,我將其視爲相同的結果。
也就是說,對於有N個交易日的一年(不包括週末,無視假日),我基本上想要生成一系列的日期並計算價格(1)與前一天相同的天數或(2)不記錄當天並將其劃分爲N.
我使用的是PostgreSQL,所以我從generate_series('2014-01-01'::timestamp, '2015-01-01'::timestamp, '1 day'::interval)
開始;我可以從這個系列的選擇,做一個WHERE排除週末:
SELECT dd
FROM generate_series(
'2014-01-01'::timestamp,
'2015-01-01'::timestamp,
'1 day'::timestamp
) dd
WHERE EXTRACT(dow FROM dd) NOT IN (0, 6);
現在,我想我想產生的bond_id
「列」加入對trade
表,但我不知道怎麼樣。從本質上講,我想最簡單的結構將是一個LEFT JOIN
讓我得到的東西,如:
EIX1923 | 2014-01-01 | 100.12
EIX1923 | 2014-01-02 | 100.10
EIX1923 | 2014-01-03 |
EIX1923 | 2014-01-04 |
EIX1923 | 2014-01-05 | 100.10
EIX1923 | 2014-01-06 |
EIX1923 | 2014-01-07 |
EIX1923 | 2014-01-08 |
EIX1923 | 2014-01-09 |
EIX1923 | 2014-01-10 | 100.15
然後,我可以只需填寫與最近獲得的價格差距,並在應用程序代碼算ABS(∆P) == 0
數量。但是,如果有解決方案完全在SQL中完成這將是很好的!我不知道上面的方法是否合適。
(我沒有打算檢查2014年1月的第一天是否是週末,因爲這只是爲了說明,但顯然它們會被排除在結果之外)。
編輯:似乎可能有一些類似的問題已經。希望它不是太重複!
編輯:所以,我打多一點與這個和這個解決方案「作品」(我不認識越早覺得很傻)在上述意義上:
SELECT
'EI653670', dd, t.price
FROM
generate_series('2014-01-01'::timestamp, '2015-01-01'::timestamp, '1 day'::interval) dd
LEFT JOIN
trade t ON dd = t.tdate AND t.id = 'EI653670'
WHERE
EXTRACT(dow FROM dd) NOT IN (0, 6) ORDER BY dd;
有沒有更好的辦法?