我有一个postgresql10数据库,其中有一个名为period的表,它存储了几种加密货币的历史价格数据。我试图查询这些数据,以找出价格在滚动时间内上涨了一定百分比的地方,即一天内上涨了5%。相关的表列是“产品id”、“结束时间”(从unix epoch开始以秒为单位)和“结束”时段的收盘价。
更新澄清:
我想查询数据库中按结束时间按时间顺序排序的每个时段
我希望结果有额外的计算列(我称之为 buy_signal
以及 sell_signal
在我的例子中,它们对应于 min_period
/ max_period
基于以下逻辑
找到最大收盘价为 max_period
在当前期间的一天内发生的(1440分钟,表中每分钟有一行)
找到最小收盘价为 min_period
在当前期间的一天内发生的 min_period.end_time < max_period.end_time
如果 min_period
以及 max_period
大于5%,则 buy_signal
与包含 min_period
是真的 sell_signal
列 max_period
行是真的
大部分内容都很简单,但我还是停留在#2中粗体的部分。好像我真的需要一个 max_period
为了把这个标准加入 min_period
查询。
给出以下简化数据:
id product_id start_time end_time close
0 BTC-USD 100000 100060 100
1 BTC-USD 100060 100120 99
2 BTC-USD 100120 100180 101
3 BTC-USD 100180 100240 105
4 BTC-USD 100240 100300 104
5 BTC-USD 100300 100360 102
6 BTC-USD 100360 100420 100
7 BTC-USD 100420 100480 98
我希望能够用额外的计算列查询这些时段,以指示何时出现了局部最小值/最大值,以及何时最小值和最大值之间的差值大于阈值。例如:
id product_id start_time end_time close buy_signal sell_signal
0 BTC-USD 100000 100060 100
1 BTC-USD 100060 100120 99 true
2 BTC-USD 100120 100180 101
3 BTC-USD 100180 100240 105 true
4 BTC-USD 100240 100300 104
5 BTC-USD 100300 100360 102
6 BTC-USD 100360 100420 100
7 BTC-USD 100420 100480 98
请注意,id为7的行是本地最小值,但它不在本地最大值之前。
这个查询的复杂性远远超出了我的sql经验,我在业余时间花了数周时间查看了堆栈溢出答案和sql功能,但这个难看的查询是我所能得到的:
SELECT
end_time,
close,
MAX(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING) AS max_close,
MIN(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING) AS min_close,
((MAX(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING) -
MIN(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING)) /
MIN(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING)) AS change_percent,
CASE WHEN
((MAX(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING) -
MIN(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING)) /
MIN(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING)) > 0.05
THEN true
END AS buy_signal
FROM Period
WHERE product_id='BTC-USD'
明显的问题是,这并不能区分最小值和最大值的顺序;它选择窗口中的最低值,而不考虑最小值是否在基于结束时间的高值之前按时间顺序出现。我一直在努力思考如何将时间过滤器与窗口相结合,找到在最高价格之前的最低价格,并将所有东西拼凑在一起。另一个(可接受的)限制是一次只对一个产品标识有效,但理想情况下,我希望查询结果包含多个不同的产品标识,按结束时间排序,信号是特定于产品标识的。
我的目标是将分页的查询结果提供给一个java应用程序(我使用的是hibernate),该应用程序使用买卖信号来训练模型。我可以使用java应用程序来预处理数据,但是对于数百万行来说,仅仅执行就需要几个小时,并且比查询选项更复杂。很抱歉问了这么长时间,但我不想漏掉任何东西。任何帮助都将不胜感激。
暂无答案!
目前还没有任何答案,快来回答吧!