1

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

我想用来SAMPLE BY查询我的数据,如下所示:

时间戳 打开 高的 低的
“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)and max(high),但我不知道如何处理打开和关闭值。

我尝试改造这种方法,但在没有错误的情况下得到了以下结果:

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. 分别与“基本查询不提供专用的 TIMESTAMP 列”和“按表达式分组与语句中选择的任何内容不匹配”错误都不起作用SAMPLE BYGROUP BY
  3. QuestDB 可以识别,CASE WHEN THEN但如果我在该部分中生成列名,则THEN它无法正常工作且没有错误消息。

我目前在浏览 QuestDB 教程、SO 问题和 GitHub 问题时被困在这一点上,因为这似乎是一个常见的操作,特别是因为他们写了许多价格时间序列数据教程,但没有一个地址这个。

我想知道是否有人遇到过这种情况并有解决方案?谢谢!

4

1 回答 1

2

它将是first()last()得到打开和关闭。

select max(high) high,
    min(low) low,
    first(open) as open,
    last(close) as close
from ohlc
SAMPLE BY 1M
于 2022-01-05T00:11:56.130 回答