2010-03-29 56 views
2

我正在試圖查詢PostgreSQL 8.4.2服務器中的一個表以獲取開高 - 低 - 關閉數據。表格和我的第一個查詢如下。查詢PostgreSQL的Open-High-Low-Close(OHLC)報告

問: 是否有一種方式來獲得相同的結果,而無需使用子查詢,如下面的例子查詢?也許使用FIRST_VALUE()或LAST_VALUE()窗口方法?

-- FIRST ATTEMPT AT OHLC 
SELECT 
    contract_id 
, TO_CHAR(ts, 'YYMMDDHH24MI') 
, (SELECT price FROM fill minF WHERE minF.fill_id = MIN(f.fill_id)) AS open 
, MAX(f.price) AS high 
, MIN(f.price) AS low 
, (SELECT price FROM fill maxF WHERE maxF.fill_id = MAX(f.fill_id)) AS close 
FROM fill f 
GROUP BY 1,2 
ORDER BY 1,2; 

-- SIMPLIFIED DDL 
CREATE TABLE fill 
(
    contract_id SEQUENCE PRIMARY KEY 
, ts   TIMESTAMP 
, price  NUMERIC(10,4) 
); 

回答

1

我想獲得分日解決方案。這似乎運作良好。

SELECT 
    contract_id 
, the_minute 
, open 
, high 
, low 
, close 
FROM 
(
    SELECT 
    contract_id 
    , TO_CHAR(ts, 'YYMMDDHH24MI') AS the_minute 
    , MIN(price) OVER w   AS low 
    , MAX(price) OVER w   AS high 
    , LAST_VALUE(price) OVER w  AS open -- Note the window is in reverse (first value comes last) 
    , FIRST_VALUE(price) OVER w AS close -- Note the window is in reverse (last value comes first) 
    , RANK() OVER w    AS the_rank 
    FROM fill 
    WINDOW w AS (PARTITION BY contract_id, TO_CHAR(ts, 'YYMMDDHH24MI') ORDER BY fill_id DESC) 
) AS inr 
WHERE the_rank = 1 
ORDER BY 1, 2; 

謝謝你,斯科特。你的回答幫助我找到了以下解決方案。

+0

* fill_id *參數來自哪裏?實際上,我試圖將此查詢適用於我的案例,但沒有成功 – Azathoth 2016-07-28 14:01:13

1

你有你的分組到一分鐘。我將假設的是錯誤的,因爲這些通常是白天完成的。如果我錯了,你必須改回它。

SELECT DISTINCT contract_id, ts::date, 
    min(price) OVER w, 
    max(price) OVER w, 
first_value(price) OVER w, 
last_value(price) OVER w 
FROM fill 
WINDOW w AS (PARTITION BY contract_id, ts::date ORDER BY ts) 
ORDER BY 1,2 
+0

感謝您的回答,斯科特,但我試圖獲得比1天的間隔更高的分辨率。您的查詢幫助我更好地瞭解了窗口,並且我認爲我有一個解決方案。 – ravi77o 2010-03-30 12:55:23