выберите максимальное и минимальное значения каждые x строк - postgresql - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь создать OHL C баров в postgresql, исходя из тиковых данных. Я хочу создавать бары каждые 1000 тиков или каждые 500 тиков. Или каждые X тиков.

База данных, которую я сохраняю, имеет цену спроса / предложения и временную метку. Я знаю, что могу выполнить группировку и сгруппировать их по отметкам времени, но желаемый результат - это количество тиков.

Один тик состоит из отметки времени, цены предложения и цены продажи.

База данных тиков выглядит примерно так:

-------------------------------------------------
|            date           |   bid   |   ask   |
|2020-03-20 19:33:56.044533 | 1.06372 | 1.06384 |
|2020-03-20 19:33:37.205241 | 1.06372 | 1.06384 |
|2020-03-20 19:33:54.943593 | 1.06372 | 1.06383 |
|2020-03-20 19:33:55.183255 | 1.06372 | 1.06384 |

Я хотел бы сгруппировать каждые X количества тиков, чтобы получить такой результат:

---------------------------------------------------------------------------
|            date           |   open   |    high    |    low   |   close   |
|2020-03-20 19:33:56.044533 | 1.06372  |   1.07104  |  1.06001 |  1.06579  |

Это 1 свеча. Цифры взяты из столбца ставок. Цена открытия - это первая зарегистрированная цена, цена закрытия - это последняя зарегистрированная цена, а максимум и минимум - это максимальная и минимальная цены, зарегистрированные в этих X тиках.

Итак, если X равен 1000 и предполагается, что индекс начинается с 0, цены OHL C будут следующими: - open: цена в индексе 0 - high: максимальная цена между индексом 0 и 999 - low: минимальная цена между индексом 0 и 999 - close: цена в индексе 999

То есть на первые 1000 тиков. Затем следующие свечи создаются следующими 1000 тиками. - открытие: цена в индексе 1000 - максимум: максимальная цена между индексом 1000 и 1999 - минимум: минимальная цена между индексом 1000 и 1999 - закрытие: цена в индексе 1999

Как я могу этого достичь?

Заранее спасибо!

1 Ответ

0 голосов
/ 05 мая 2020

Вы можете агрегировать фиксированное количество строк, используя row_number() и арифметические c:

select min(date),
       (array_agg(bid order by seqnum asc))[1] as open,
       (array_agg(bid order by seqnum desc))[1] as close,
       min(bid) as min_bid, max(bid) as max_bid
from (select t.*, row_number() over (order by date) as seqnum
      from ticks t
     ) t
group by floor((seqnum - 1) / 500);

Это использует «взлом» для получения open и close - с использованием массивов.

...