每x数量的行选择最大值和最小值-postgresql

时间:2020-05-05 05:34:56

标签: sql postgresql candlestick-chart ohlc

我正在尝试从tick数据开始在PostgreSQL中创建OHLC条。我想每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  |

那是一支蜡烛。这些数字来自出价列。开盘价是记录的第一个价格,收盘价是记录的最后一个价格,最高价和最低价是这X个报价中记录的最高价和最低价。

因此,如果X为1000并假设索引从0开始,那么OHLC价格将如下所示: -开盘:指数为0的价格 -高:最高价格介于索引0和999之间 -低:索引0和999之间的最低价格 -收盘价:指数999的价格

那是前1000个滴答声。然后在接下来的1000个滴答声中创建下一个蜡烛。 -开盘:指数1000价格 -高:价格在1000到1999之间的最高价格 -低:指数1000和1999之间的最低价格 -收盘:1999年指数价格

我该如何实现?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用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

相关问题