【问题标题】:select max and min values every x amount of rows-postgresql每x行选择最大值和最小值-postgresql
【发布时间】:2020-08-19 17:10:27
【问题描述】:

我正在尝试从刻度数据开始在 postgresql 中创建 OHLC 条。我想每 1000 个刻度或每 500 个刻度创建条形图。或每 X 个刻度。

我正在保存的数据库包含出价/要价和时间戳。我知道我可以进行 groupby 并按时间戳对它们进行分组,但所需的输出是使用刻度数。

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

tick 数据库如下所示:

-------------------------------------------------
|            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 年指数价格

我怎样才能做到这一点?

提前谢谢你!

【问题讨论】:

  • 请参阅How to Ask。这样做会大大增加您获得满意答案的机会。特别是,您需要格式化文本形式的样本数据 - 无图像,来自该数据的所需结果,表定义 (DDL)。包括您已经尝试过的内容。描述任何专业术语;什么是勾号。
  • 感谢您的评论,保护者。根据您的要求,我添加了更多信息。希望这能澄清我的问题。
  • 嗯,这有点东西。但是,您还没有定义一个刻度。我认为这是领域知识术语,但对于领域外的人来说毫无意义。每个时间戳是一个滴答声,发布的数据涵盖约 20 秒,一个滴答声是 20 秒,还是别的什么?此外,无法从输入中获取输出,输入中不存在高、低、关闭的值。
  • 什么是“蜡烛”?
  • 报价是资产@Belayer 价格的变化。当买入价或卖出价发生变化(或交易量发生变化)时,即被视为一次跳动。

标签: sql postgresql candlestick-chart ohlc


【解决方案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 -- 通过使用数组。

【讨论】:

  • 谢谢@GordonLinoff。我收到此错误:“错误:FROM 中的子查询必须有别名第 7 行:来自 (^ 提示:例如,FROM (SELECT ...) [AS] foo。SQL 状态:42601 字符:277”我试过自己修改查询,但无法修复。知道为什么吗?
  • @PedroPabloSeverinHonorato 。 . .子查询确实有别名。
  • 谢谢! @GordonLinoff,这有效:)。还有一件事,如果我有所需的刻度数,我怎么能只创建蜡烛?例如,如果我有 10500 个刻度,那么我希望只有 10 行并且在数量为 11000 之前不考虑其他 500 个剩余刻度
  • @PedroPabloSeverinHonorato 。 . .我认为你应该问另一个问题,清楚地解释你想做什么。这个问题完全不同。
猜你喜欢
  • 1970-01-01
  • 2020-05-16
  • 2014-12-01
  • 2019-02-09
  • 2021-04-25
  • 2014-12-01
  • 2015-01-09
  • 2010-10-21
  • 2015-08-27
相关资源
最近更新 更多