在过去 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 天的最低和最高温度 [关闭]

获取 MySQL 的最后 6 行并为每行定义变量?

根据前一个 24 小时平均值查询浓度的时间和平均值

Pandas 时间序列数据 - 每 30 分钟计算过去 24 小时内的唯一值

在mysql中选择至少有两个[activity]且间隔时间至少为24小时的[sth]

在mysql中转换为24小时格式