【问题标题】:How do I aggregate open and close values in QuestDB using SAMPLE BY如何使用 SAMPLE BY 在 QuestDB 中聚合打开和关闭值
【发布时间】:2022-01-04 23:44:23
【问题描述】:

我正在做一个价格数据项目,试图存储 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 列”和“按表达式分组与语句中的任何选择不匹配”错误。
  3. QuestDB 可以识别 CASE WHEN THEN,但如果我在 THEN 部分生成列名,则它无法正常工作且没有错误消息。

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

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

【问题讨论】:

    标签: aggregate-functions questdb ohlc


    【解决方案1】:

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

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

    【讨论】:

    • 天哪,我想多了。非常感谢!
    猜你喜欢
    • 2020-05-02
    • 2023-04-02
    • 2021-12-06
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    相关资源
    最近更新 更多