在过去 24 小时内从 MySQL 中选择行并根据间隔 X 跳过行?
Posted
技术标签:
【中文标题】在过去 24 小时内从 MySQL 中选择行并根据间隔 X 跳过行?【英文标题】:Select rows from MySQL in the last 24 hours and skip rows based on interval X? 【发布时间】:2018-12-17 21:42:52 【问题描述】:我创建了一个交易机器人,我使用 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 + (interval) 的所有行。
选择第一个时间戳,创建局部变量@start_time
,@offset
,@count
然后选择min(TimeStamp
)> @start_time + INTERVAL(@offset
* @count
)MINUTE
使用自动递增 ID 解决方案时我面临的问题是我正在跟踪同一张表中 220 件商品的价格(因此顺序 ID 不起作用),因此可能需要创建一个新的索引行在查询开始时。我面临的另一个问题是我的代码是同步的,因此由于其他正在运行的进程,每次导入数据的时间都在 5 分钟到 5 分钟 30 秒之间。
感谢您的帮助!
最好的问候,
啜饮
Expected output:
1. 2018-12-14 23:00:05 1001
3. 2018-12-14 23:11:16 1001
5. 2018-12-14 23:21:25 1001
7. 2018-12-14 23:32:41 1001
9. 2018-12-14 23:42:51 1001
11. 2018-12-14 23:52:56 1001
【问题讨论】:
明确地说,根据您的示例数据,预期的结果是什么? 我编辑了我的问题以修复时间戳并添加预期输出 这看起来很有希望blog.timescale.com/… 它比您的用例复杂得多,但为如何解决一些固有问题提供了一些想法 不确定为什么10.
行在预期的输出中。与9.
在相同的 10 分钟内
编辑问题以反映错误
【参考方案1】:
使用窗口函数(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
【讨论】:
感谢您的快速响应!我正在使用没有 ROW_NUMBER() 函数的 mysql 5.7,我正在尝试根据 mysql 文档重新创建解决方法。我将您的答案标记为正确,因为我能够通过 dbfiddle 重现您的解决方案 this the second answer here中有一个通用的形式。【参考方案2】: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`;
【讨论】:
以上是关于在过去 24 小时内从 MySQL 中选择行并根据间隔 X 跳过行?的主要内容,如果未能解决你的问题,请参考以下文章
选择过去 24 小时和过去 30 天的最低和最高温度 [关闭]
Pandas 时间序列数据 - 每 30 分钟计算过去 24 小时内的唯一值