在过去24小时内从MySQL中选择行,然后根据间隔X跳过行?

时间:2018-12-17 21:42:52

标签: mysql sql

我创建了一个交易机器人,并使用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

不幸的是,我想到了两种可能的解决方案。

  1. 向我的表添加一个自动增量ID,创建一个查询以选择行号。创建一个局部变量@rownum,然后选择@rownum = @rownum +(间隔)的所有行。

  2. 选择第一个时间戳,创建局部变量@start_time@offset@count,然后选择min({TimeStamp)> @start_time + INTERVAL({{ 1}} * {@offset)分钟

使用自动递增ID解决方案面临的问题是,我正在跟踪同一张表中的220件商品的价格(因此,顺序ID无效),因此可能需要创建一个新的索引行在查询开始时。我面临的另一个问题是我的代码是同步的,因此由于其他正在运行的进程,每次导入数据的时间介于5分钟-5分钟30秒之间。

感谢您的帮助!

最好的问候

s饮

@count

Expected output:

2 个答案:

答案 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`;