简体   繁体   English

MySQL获取具有时间间隔的行

[英]MySQL get rows with time interval

I have a table with some columns where one column has timestamp where data is created. 我有一个包含一些列的表,其中一列有创建数据的时间戳。 Suppose following is a table. 假设以下是表格。

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

On an average of every one second, one entry goes to that table. 平均每一秒,一个条目进入该表。 This is too much data to show on UI. 这是在UI上显示的太多数据。 I want data to be consolidated for every 10 minutes. 我希望每10分钟合并一次数据。

ie only two row should come as result. 即结果只有两行。 The value of column val can be anything, it is ok if the val is any one of them or the average of them. val的值可以是任何值,如果val是它们中的任何一个或它们的平均值就可以了。

Desired output (any of three) 期望的输出(三个中的任何一个)

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

OR 要么

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

OR 要么

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

Is there a way to make that 10 minutes as dynamic parameters? 有没有办法让这10分钟成为动态参数? (static is ok for start) (静态可以开始)

EDIT Including my comment here: I am using hibernate, so preference is hibernate. 编辑在这里包括我的评论:我正在使用hibernate,所以首选是hibernate。 But if that does not work then we only have option with MySQL native. 但如果这不起作用,那么我们只能选择MySQL本机。 There is no criteria of last X rows, I want all the rows for particular id and between particular date. 没有最后X行的标准,我想要特定id的所有行以及特定日期之间的行。 It's just that i want less rows with 10 mins of interval. 只是我需要更少的行,间隔为10分钟。

Following query will give your expected result. 以下查询将给出您的预期结果。

MySQL syntax 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 syntax 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

EDIT : Updated MySQL Syntax of query. 编辑:更新了查询的MySQL语法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM