我创建了一个交易机器人,并使用MySQL导入数据并计算技术指标,我想创建一个功能,使我可以更频繁地导入数据并控制选择数据的间隔。
是否存在允许我在mysql中以固定间隔选择数据的查询?
SELECT * FROM PriceHistory
WHERE `RefrenceID`=1001
and `TimeStamp` > (SELECT max(`TimeStamp`) FROM PriceHistory) -
Interval 1440 Minute
Group by `TimeStamp`;
使用此查询,我可以选择最近24小时的价格数据。我是否可以选择以5分钟,10分钟,30分钟等间隔选择数据?
DataSet Example
`TimeStamp` `RefrenceID`
1. 2018-12-14 23:00:05 1001
2. 2018-12-14 23:05:10 1001
3. 2018-12-14 23:11:16 1001
4. 2018-12-14 23:16:21 1001
5. 2018-12-14 23:21:25 1001
6. 2018-12-14 23:26:30 1001
7. 2018-12-14 23:32:41 1001
8. 2018-12-14 23:37:46 1001
9. 2018-12-14 23:42:51 1001
10. 2018-12-14 23:47:51 1001
11. 2018-12-14 23:52:56 1001
不幸的是,我想到了两种可能的解决方案。
向我的表添加一个自动增量ID,创建一个查询以选择行号。创建一个局部变量@rownum
,然后选择@rownum = @rownum +(间隔)的所有行。
选择第一个时间戳,创建局部变量@start_time
,@offset
,@count
,然后选择min({TimeStamp
)> @start_time + INTERVAL({{ 1}} * {@offset
)分钟
使用自动递增ID解决方案面临的问题是,我正在跟踪同一张表中的220件商品的价格(因此,顺序ID无效),因此可能需要创建一个新的索引行在查询开始时。我面临的另一个问题是我的代码是同步的,因此由于其他正在运行的进程,每次导入数据的时间介于5分钟-5分钟30秒之间。
感谢您的帮助!
最好的问候
s饮
@count
Expected output:
答案 0 :(得分:2)
使用窗口函数(MySQL-8.0,MariaDB-10.2),我们DIV 600
以10分钟(600秒)的间隔进行分区。我们按ID在每个组中排第一。
SELECT id, entrytime, RefrenceID
FROM (
SELECT
id, entrytime, RefrenceID,
ROW_NUMBER() OVER (PARTITION BY RefrenceID,UNIX_TIMESTAMP(entrytime) DIV 600 ORDER BY id) AS `rank`
FROM timedata
ORDER BY id
) AS tmp
WHERE tmp.`rank` = 1
ORDER BY id, entrytime;
参考:dbfiddle
答案 1 :(得分:0)
SELECT *
FROM PriceHistory
WHERE
`RefrenceID`=1001
AND `TimeStamp` > (SELECT max(`TimeStamp`) FROM PriceHistory) - Interval 1440 Minute
AND substring_index(TimeStamp,':',1)%5=0
GROUP BY `TimeStamp`;