【问题标题】:MySQL get rows with time intervalMySQL获取具有时间间隔的行
【发布时间】:2016-07-02 10:08:13
【问题描述】:

我有一个包含一些列的表,其中一列具有创建数据的时间戳。 假设下面是一个表格。

id | val | time
---+-----+--------------------
1  |  1  |2016-07-02 03:31:31
1  |  2  |2016-07-02 03:32:32
1  |  2  |2016-07-02 03:33:33
1  |  3  |2016-07-02 03:33:34
1  |  4  |2016-07-02 03:41:31
1  |  5  |2016-07-02 03:41:32
1  |  5  |2016-07-02 03:46:33
1  |  6  |2016-07-02 03:47:34

平均每秒钟就有一个条目进入该表。这是太多数据,无法在 UI 上显示。我希望每 10 分钟合并一次数据。

即结果应该只有两行。 val 列的值可以是任意值,val 是其中任何一个或它们的平均值都可以。

期望的输出(三个中的任何一个)

id | val | time
---+-----+--------------------
1  |  1  |2016-07-02 03:3X:XX
1  |  4  |2016-07-02 03:4X:XX

id | val | time
---+-----+--------------------
1  |  2  |2016-07-02 03:3X:XX
1  |  5  |2016-07-02 03:4X:XX

id | val | time
---+-----+--------------------
1  |  3  |2016-07-02 03:3X:XX
1  |  6  |2016-07-02 03:4X:XX

有没有办法将这 10 分钟作为动态参数? (静态启动即可)

编辑 包括我在这里的评论:我正在使用休眠,所以偏好是休眠。但如果这不起作用,那么我们只能选择 MySQL 本机。最后 X 行没有标准,我想要特定 id 和特定日期之间的所有行。只是我希望间隔 10 分钟的行数更少。

【问题讨论】:

  • mysql raw,还是休眠?你有一个冬眠的问题去别处。此外,要清楚从查询中吐出什么,例如从now() 向后的最后 X 行(10 分钟间隔)或其他东西。必须有人实际编写此代码,并希望第一次就正确完成
  • 我正在使用休眠,所以首选休眠。但如果这不起作用,那么我们只能选择 MySQL 本机。最后 X 行没有标准,我想要特定 id 和特定日期之间的所有行。只是我想要间隔 10 分钟的行数更少。希望这次我清楚了。
  • 好的,所以你想通过两个datetimes,然后有 10 分钟的间隔。我可以在非休眠状态下做到这一点,但现在是凌晨 2 点,我已经筋疲力尽了。

标签: mysql sql time intervals


【解决方案1】:

以下查询将给出您预期的结果。

MySQL 语法

DROP TABLE TEMP_TEST;
CREATE TABLE TEMP_TEST(ID INT,VAL INT,TIME DATETIME);

INSERT INTO TEMP_TEST VALUES
(1,1,'2016-07-02 03:31:31'),
(1,2,'2016-07-02 03:32:32'),
(1,2,'2016-07-02 03:33:33'),
(1,3,'2016-07-02 03:33:34'),
(1,4,'2016-07-02 03:41:31'),
(1,5,'2016-07-02 03:41:32'),
(1,5,'2016-07-02 03:46:33'),
(1,6,'2016-07-02 03:47:34'),
(1,6,'2016-07-02 03:51:34');


SELECT @INTERVAL := 10, @PREVIOUS_TIME := (select time from TEMP_TEST LIMIT  1);
SELECT TIME,
@INTERVAL ,
@PREVIOUS_TIME,
TIMESTAMPDIFF(MINUTE,@PREVIOUS_TIME,TIME) AS DIFF_INTERVAL,
  (CASE
    WHEN ((TIMESTAMPDIFF(MINUTE,@PREVIOUS_TIME,TEMP_TEST.TIME))%@INTERVAL)=0 THEN "TRUE"
    ELSE "FALSE"
  END) AS VALID
from TEMP_TEST;

SQL Server 语法

DROP TABLE #TEMP_TEST;
CREATE TABLE #TEMP_TEST(ID INT,VAL INT,TIME DATETIME)

INSERT INTO #TEMP_TEST VALUES
(1,1,'2016-07-02 03:31:31'),
(1,2,'2016-07-02 03:32:32'),
(1,2,'2016-07-02 03:33:33'),
(1,3,'2016-07-02 03:33:34'),
(1,4,'2016-07-02 03:41:31'),
(1,5,'2016-07-02 03:41:32'),
(1,5,'2016-07-02 03:46:33'),
(1,6,'2016-07-02 03:47:34'),
(1,6,'2016-07-02 03:51:34');


DECLARE @INTERVAL INT=10;
DECLARE @PREVIOUS_TIME DATETIME;
SELECT TOP 1 @PREVIOUS_TIME=TIME FROM #TEMP_TEST ORDER BY TIME

SELECT TIME,
@INTERVAL AS INTERVAL ,
@PREVIOUS_TIME AS PREVIOUS_TIME, 
DATEDIFF(MINUTE,@PREVIOUS_TIME,TIME) AS DIFF_INTERVAL,
CASE WHEN (((DATEDIFF(MINUTE,@PREVIOUS_TIME,TIME))%@INTERVAL)=0) THEN 'TRUE' ELSE 'FALSE' END AS TRUE
FROM #TEMP_TEST
WHERE (CASE WHEN (((DATEDIFF(MINUTE,@PREVIOUS_TIME,TIME))%@INTERVAL)=0) THEN 'TRUE' ELSE 'FALSE' END)='TRUE'
ORDER BY TIME

编辑:更新了查询的 MySQL 语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2014-08-07
    • 1970-01-01
    • 2017-08-25
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多