AWS Timestream:如何选择 OHLC 值?

问题描述 投票:0回答:2

我正在尝试使用 AWS Timestream 作为股票分析应用程序 POC 的数据源。我计划以数据库中可用的最低间隔保存股票数据,然后查询所需的时间范围。

到目前为止我尝试的是使用窗口函数

但我就是无法让它发挥作用。我已经尝试过以下查询:

SELECT BIN(time, 15m) as binned_timestamp,
    max(measure_value::double) as high,
    first_value(measure_value::double) over (partition by BIN(time, 15m)) as open,
    last_value(measure_value::double) over (partition by BIN(time, 15m)) as close,
    min(measure_value::double) as low
FROM mydb.mytable
GROUP BY BIN(time, 15m),
    first_value(measure_value::double),
    last_value(measure_value::double)
ORDER BY binned_timestamp

结果

第 3:2 行: '"first_value"(measure_value::double) OVER (PARTITION BY "BIN"(time, INTERVAL '15' MINUTE))' 必须是聚合表达式或出现在 GROUP BY 子句中


SELECT BIN(time, 15m) as binned_timestamp,
    max(measure_value::double) as high,
    first_value(measure_value::double) over (partition by BIN(time, 15m)) as open,
    last_value(measure_value::double) over (partition by BIN(time, 15m)) as close,
    min(measure_value::double) as low
FROM mydb.mytable
GROUP BY BIN(time, 15m),
    first_value(measure_value::double),
    last_value(measure_value::double)
ORDER BY binned_timestamp

结果

第 8:2 行:GROUP BY 子句不能包含聚合、窗口函数或分组操作: ["first_value"(measure_value::double) OVER (PARTITION BY "BIN"(time, INTERVAL '15' MINUTE))]


这两者有点矛盾。两者都说以另一种方式进行,但另一种方式说按照您之前的方式进行..

所以我有点陷入困境,而且我的 SQL 技能也不是很离谱。如有任何帮助,我们将不胜感激。

sql amazon-web-services amazon-timestream
2个回答
0
投票

我尝试过类似的东西:

WITH ohlc_list AS (
  select bin(time, 180s) as ohlc_time,
    first_value(open) over (partition by bin(time, 180s)) as ohlc_open,
    max(high) over(partition by bin(time, 180s)) as ohlc_high,
    min(low) over(partition by bin(time, 180s)) as ohlc_low,
    last_value(close) over (partition by bin(time, 180s)) as ohlc_close,
    row_number() over (partition by bin(time, 180s)) as ohlc_row_number
  from "coinstrue_engine_dev"."ohlc"
)
SELECT *
FROM ohlc_list
where ohlc_row_number=1
order by ohlc_time ASC

这不是最佳的,但至少,这个版本应该适用于你的 POC。


0
投票

您应该能够通过此请求实现您想要的目标。您可以根据您需要的间隔调整分档时间。

SELECT 
measure_name,
BIN(time, 1d) AS time,
MIN(measure_value::double) as low, MAX(measure_value::double) as high, MIN_BY(measure_value::double,time) as open,MAX_BY(measure_value::double,time) as close
FROM "dev-af-timestream-database"."tick-data-uls00011" 
WHERE time BETWEEN '2024-04-15' AND '2024-04-19'
AND 
measure_name = 'price'
GROUP BY (   measure_name, BIN(time, 1d))
ORDER BY time DESC
© www.soinside.com 2019 - 2024. All rights reserved.