Запрос PostgreSQL для отчета Open-High-Low-Close (OHLC) - PullRequest
3 голосов
/ 30 марта 2010

Я пытаюсь запросить таблицу на сервере PostgreSQL 8.4.2 для получения данных открытия-открытия-закрытия. Таблица и мой первый запрос приведены ниже.

Вопрос: Есть ли способ получить те же результаты без использования подзапросов, как в примере запроса ниже? Возможно, используя методы окна 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)
);

Ответы [ 2 ]

2 голосов
/ 30 марта 2010

Я бы хотел получить разрешение на день. Похоже, это работает хорошо.

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;

Спасибо, Скотт. Ваш ответ помог мне найти следующее решение.

1 голос
/ 30 марта 2010

Вы сгруппированы по минутам. То, что я собираюсь предположить, неверно, потому что это обычно делается днем. Если я ошибаюсь, вам придется вернуть его обратно.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...