我有一个包含一些列的表,其中一列具有创建数据的时间戳。
假设下面是一个表。
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语法
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语法。