2010-03-29 3 views
2

Open-high-low-close 데이터를 얻기 위해 PostgreSQL 8.4.2 서버의 테이블을 쿼리하려고합니다. 테이블과 첫 번째 쿼리는 아래와 같습니다.OHLC (Open-High-Low-Close) 보고서에 대한 PostgreSQL 쿼리

질문 : 아래 예제 쿼리에서 서브 쿼리를 사용하지 않고 동일한 결과를 얻는 방법이 있습니까? 아마도 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

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

답장을 보내 주셔서 감사합니다. Scott, 그러나 1 일 간격보다 높은 해상도를 얻으려고합니다. 귀하의 질의는 좀 더 나은 윈도우 잉 이해에 도움이되었고 솔루션이 있다고 생각합니다. – ravi77o

관련 문제