select 每 x 行数的最大值和最小值-postgresql

select max and min values every x amount of rows-postgresql

我正在尝试从报价数据开始在 postgresql 中创建 OHLC 柱。我想每 1000 个跳动点或每 500 个跳动点创建一个柱。或者每 X 次刻度。

我保存的数据库有 bid/ask 和时间戳。我知道我可以做一个 groupby 并按时间戳对它们进行分组,但所需的输出使用的是刻度数。

一个报价由时间戳、买入价和卖出价组成。

报价数据库看起来像这样:

-------------------------------------------------
|            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 开始,则 OHLC 价格将如下所示: - 开盘:指数 0 的价格 - 高:索引 0 和 999 之间的最高价格 - 低:指数 0 和 999 之间的最低价格 - 收盘价:指数 999

的价格

这是前 1000 个刻度。然后下一个蜡烛由接下来的 1000 个滴答声创建。 - 开盘价:指数 1000 - 高:指数 1000 和 1999 之间的最高价格 - 低:指数 1000 和 1999 之间的最低价格 - 收盘价:指数 1999 的价格

我怎样才能做到这一点?

提前致谢!

您可以使用 row_number() 和算术聚合固定数量的行:

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);

这使用 "hack" 来获取 openclose -- 通过使用数组。