CREATE "ohlc_minutes" (
"id" int4 NOT NULL DEFAULT nextval('ohlc_minutes_id_seq'::regclass),
"ticker" varchar NOT NULL,
"date" timestamptz NOT NULL,
"open" numeric(20,8) NOT NULL,
"high" numeric(20,8) NOT NULL,
"low" numeric(20,8) NOT NULL,
"close" numeric(20,8) NOT NULL,
PRIMARY KEY ("id")
);
Query:
SELECT
to_timestamp(floor(EXTRACT(EPOCH FROM date) / 300) * 300) AS group_date,
(array_agg(open ORDER BY date ASC)) [1] AS OPEN, -- Take the first open candle in the group
MAX(high) AS high,
MIN(low) AS low,
(array_agg(close ORDER BY date DESC)) [1] AS CLOSE, -- Take the last closed candle in the group
COUNT(*) AS minutes_count
FROM ohlc_minutes
WHERE ticker = 'BTCUSD'
GROUP BY ticker, group_date
ORDER BY group_date;
to_timestamp(floor(EXTRACT(EPOCH FROM date) / 300) * 300) AS group_date
- преобразует временные метки в интервалы по 5 минут (300 секунд). Это позволяет сгруппировать данные по 5-минутным интервалам.
(array_agg(open ORDER BY date ASC)) [1] AS OPEN
- сортирует (по возрастанию) все значения группы как массив и выбирает первую цену как цену открытия.
MAX(high) AS high
- находит максимальную цену в группе.
MIN(low) AS low
- находит минимальную цену в группе.
(array_agg(close ORDER BY date DESC)) [1] AS CLOSE
сортирует (по убыванию) все значения группы как массив и выбирает первую цену как цену закрытия.
COUNT(*) AS minutes_count
- считает количество записей (минут) в каждой группе.