如何使用 SAMPLE BY 在 QuestDB 中聚合开盘价和收盘价

How do I aggregate open and close values in QuestDB using SAMPLE BY

我正在做一个价格数据项目,试图存储 OHLC 1 分钟的数据,然后在不同的时间间隔内对其进行采样。我决定尝试使用 QuestDB,因为它具有整洁的时间序列功能,例如 SAMPLE BY 但我 运行 撞墙了。

我想使用 SAMPLE BY 来查询我的数据,它看起来像这样:

timestamp open high low close
"2021-09-10T19:43:21.657672Z" 2.0 4.0 1.0 3.0
"2021-09-15T06:12:42.267416Z" 3.0 6.0 3.0 6.0

例如,对于同一个月的上面两行,我想 运行 SAMPLE BY 1M 并汇总该月的值。

对于高值和低值,聚合函数是 min(low)max(high),但我不知道如何处理开盘价和收盘价。

我尝试过改造 this approach,但没有出现以下错误:

with ohlc as ( 
    select row_number() over (
        partition by cast(cast(timestamp as float) / 1000000 / 60 / 60 / 24 / 7 / 4.34524 as int)
        order by timestamp
    ), open, high, low, close, timestamp
    from eurusd
) 
select max(high) high,
    min(low) low,
    min(case when rn_asc = 1 then [open] end) as open
from ohlc

我遇到的一些错误:

  1. 添加第二个 row_number() over [...] order by timestamp desc 失败并出现语法错误。如果我删除 desc 它会起作用,所以我只是完全删除了该列,因为它与第一列相同。
  2. 末尾的 SAMPLE BYGROUP BY 都无法处理“基本查询不提供专用的 TIMESTAMP 列”和“按表达式分组不匹配语句中的任何内容 select”错误, 分别.
  3. QuestDB 识别 CASE WHEN THEN,但如果我在 THEN 部分生成一个列名,它就无法工作,没有错误消息。

我目前在查看 QuestDB 教程、SO 问题和 GitHub 问题时遇到了这个问题,因为这似乎是一个常见的操作,特别是因为他们写了很多价格时间序列数据教程,但 none 解决了这个问题。

我想知道是否有人遇到过这个问题并且有解决办法?谢谢!

打开和关闭将是first()last()

select max(high) high,
    min(low) low,
    first(open) as open,
    last(close) as close
from ohlc
SAMPLE BY 1M