首页 > 解决方案 > 每分钟给定日期,每两个提取一次

问题描述

我有一个如下表:

 ID     Date                    Value
 1      2018-04-29 14:51:01     0.1
 2      2018-04-29 14:51:01     0.21
 3      2018-04-29 14:51:01     0.123
 2      2018-04-29 14:52:01     5.7
 3      2018-04-29 14:52:01     1.2
 1      2018-04-29 14:52:01     5.9
 1      2018-04-29 14:53:01     1.23
 3      2018-04-29 14:53:01     7.9
 2      2018-04-29 14:53:01     1.68
 1      2018-04-29 14:54:01     0.01
 2      2018-04-29 14:54:01     0.068
 3      2018-04-29 14:54:01     0.2686
 2      2018-04-29 14:55:01     2.3
 3      2018-04-29 14:55:01     3.4
 1      2018-04-29 14:55:01     5.7
 1      2018-04-29 14:56:01     102.357
 3      2018-04-29 14:56:01     12.36
 2      2018-04-29 14:56:01     123.47
 1      2018-04-29 14:57:01     12379.42
 2      2018-04-29 14:57:01     1230.1
 3      2018-04-29 14:57:01     35.235
 2      2018-04-29 14:58:01     1237.3
 3      2018-04-29 14:58:01     4.68
 1      2018-04-29 14:58:01     123.578
 1      2018-04-29 14:59:01     1233.57
 3      2018-04-29 14:59:01     23.457
 2      2018-04-29 14:59:01     0.213

每分钟插入一次 ID 及其日期(在插入当前时间戳上)。一些 ID 可以在表格中存在一段时间,并且它们可以稍后在不同的时间重新出现。这些 id 没有顺序,它们可以在当前分钟“批次”的任何地方。

从此表中,我想每 2 分钟提取一次值,因此输出应如下所示:

 ID     Date                    Value
 1      2018-04-29 14:51:01     0.1
 2      2018-04-29 14:51:01     0.21
 3      2018-04-29 14:51:01     0.123
 1      2018-04-29 14:53:01     1.23
 3      2018-04-29 14:53:01     7.9
 2      2018-04-29 14:53:01     1.68
 2      2018-04-29 14:55:01     2.3
 3      2018-04-29 14:55:01     3.4
 1      2018-04-29 14:55:01     5.7
 1      2018-04-29 14:57:01     12379.42
 2      2018-04-29 14:57:01     1230.1
 3      2018-04-29 14:57:01     35.235

PD:我不能在这个查询中使用变量,但我可以根据需要创建函数/过程。

就我对 MySQL 的了解而言……对我来说最简单的事情是创建另一个表,其中包含每两分钟运行一次的预定事件并提取当前值并将它们插入新表中。

此查询的另一个问题是,如果仅由一个查询完成,则 1 分钟间隔表有数百万行具有许多不同的 ID。

那么,最好继续研究如何构建查询或创建带有预定事件的表?

标签: mysqldatedatetimetimestamp

解决方案


MySQLminute()函数是您的解决方案的基础 - 它返回参数的分钟部分,例如

minute('2018-04-29 14:51:01') -- returns 51

对此使用 mod 部门:

select ...
from ...
where minute(date) % 2 = 1  -- only odd minutes

同样,每三分钟将是:

where minute(date) % 3 = 1 

等等。

如果你想更高级,你可以在你想要的小时后手工挑选分钟,例如所有的黄金时间:

where minute(date) in (2,3,5,7,11,13,17,23,29,31,37,41,43,47,53,59)

推荐阅读