Сохраняйте первое значение в дате при повторной выборке агрегатов в PostgreSQL - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть значения по минутам, и я пытаюсь пересчитать их по часам.Поскольку они являются ценами на акции, у меня есть открытые и закрытые столбцы.При пересчете мне нужно в открытых столбцах держать цену с первой минуты каждого часа ...

Было бы что-то вроде этого, если бы была функция агрегации FIRST:

SELECT date_trunc('hour', date_) AS date_by_hour, 
FIRST("open") AS "open", MAX(high) AS high, MIN(low) AS low, LAST("close") AS "close", AVG(weighted_price) AS price
FROM btc_usd
GROUP BY 1

пример:

open,high,low,close,date_
262.50,262.20,262.80,262.28,2015-01-27 16:22:00
262.20,262.20,262.28,262.28,2015-01-27 16:23:00
262.15,262.15,262.15,262.15,2015-01-27 16:24:00
262.15,262.15,262.15,262.15,2015-01-27 16:25:00
262.09,262.15,262.09,262.15,2015-01-27 16:26:00
262.07,262.20,261.87,262.28,2015-01-27 16:27:00
262.10,262.10,262.18,262.18,2015-01-27 16:28:00
262.10,262.10,262.18,262.18,2015-01-27 16:29:00
262.15,262.50,262.15,262.49,2015-01-27 16:30:00

даст:

open,high,low,close,date_
262.50,262.50,261.87,262.49,2015-01-27 16:00:00

ОБНОВЛЕНИЕ:

SELECT DISTINCT ON
( date_trunc( 'hour', date_ )) "open", date_
FROM btc_usd
ORDER BY date_trunc( 'hour', date_ ), date_

это дает первое и с помощью DESC на закрытии я могу получитьпоследний

1 Ответ

0 голосов
/ 12 сентября 2018

Одним из решений является использование DISTINCT и различных оконных функций, first_value() и last_value() среди прочих, то есть.

SELECT DISTINCT
       first_value("open") OVER (PARTITION BY date_trunc('hour', "date_")
                                 ORDER BY "date_"
                                 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) "open",
       max("high") OVER (PARTITION BY date_trunc('hour', "date_")) "high",
       min("low") OVER (PARTITION BY date_trunc('hour', "date_")) "low",
       last_value("close") OVER (PARTITION BY date_trunc('hour', "date_")
                                 ORDER BY "date_"
                                 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) "close",
       date_trunc('hour', "date_") "date_"
       FROM "btc_usd";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...