MySQL - 用于跳过间隔的SQL,例如每5分钟记录一次

时间:2014-08-09 17:43:10

标签: mysql sql intervals

我需要什么。一个SQL语句,它将查找最新的记录,然后查找下一条记录,该记录比该记录的时间戳落后5分钟并重复直到达到限制。时间戳是unix时间。所以得到最新的记录然后减去5分钟,得到那个记录并重复。 5分钟就是一个例子。它实际上是从第二个到几个小时的变量。 我可以轻松地用Perl,Ruby或Bash编写一些东西,用一个有效的select内部循环,但是希望有一种可能更快的纯SQL方式。任何帮助表示赞赏。

在下方添加了更多信息。

下面显示了数据库表中记录的一个非常小的剪辑。基本上数据相隔20秒插入。我希望能够根据通过CGI脚本传递的变量以及我想要返回的记录总数,以不同的间隔选择记录。

> select * from Sensor1 order by ts desc limit 5;
+------------+-------------+----------+
| ts         | temperature | humidity |
+------------+-------------+----------+
| 1407612981 |       75.91 |     56.5 |
| 1407612961 |       75.92 |     56.4 |
| 1407612941 |       75.92 |     56.5 |
| 1407612921 |       75.91 |     56.4 |
| 1407612901 |       75.91 |     56.4 |
+------------+-------------+----------+

所以一个例子是,我想要最新的记录,然后是5分钟后的那个,然后是5分钟再回到CGI脚本传递的其他变量。 以下是基于想要记录的样本输出,这些记录最接近5分钟进行5次迭代。

+------------+-------------+----------+
| ts         | temperature | humidity |
+------------+-------------+----------+
| 1407612681 |       75.92 |     56.4 |
| 1407612381 |       75.92 |     56.4 |
| 1407612081 |       75.90 |     56.3 |
| 1407611781 |       75.91 |     56.4 |
| 1407611481 |       75.90 |     56.4 |
+------------+-------------+----------+

所以我可以使用简单的bash脚本完成上述操作。见下文。

#!/bin/bash
increment=5     # How many records we want
interval=300    # The number of seconds between each returned result
tc1=1
while [ $tc1 -lt $increment ]
do
  time=$(($time-$interval))    # This line makes sure our next select query is 300 seconds behind
  record=`echo "select * from Sensor${sensor} where ts >= ${time} order by ts asc limit 1;" | mysql -u env -penv -h localhost dc_temp | sed 's/\t/|/g' | grep -v "ts|temperature|humidity"`
  echo "Debug: ${record}"
  time=`echo $record | cut -d'|' -f1`  # Get the time from output.
  tc1=$((tc1+1))   # Add 1 to our temporary count to end the while loop when we reach how many records they want
done

所以上面的脚本给了我想要和控制的输出。但我担心大量的选择会变慢。我希望在每个记录之间以不同的间隔提取24小时,1周,1个月,1年的数据。基本上24小时,每5分钟拉一次。一个星期拉可能一小时记录一小时等。数据全部转到RGraph创建历史温度和湿度的折线图。

1 个答案:

答案 0 :(得分:0)

您可以尝试运行以下代码:

CREATE TABLE dbo.TimeTable(value INT,time DATETIME);
GO
SET NOCOUNT ON;
GO
INSERT dbo.TimeTable(value, time) SELECT 1, DATEADD(MINUTE, -7, GETDATE());
INSERT dbo.TimeTable(value, time) SELECT 2, DATEADD(MINUTE, -6, GETDATE());
INSERT dbo.TimeTable(value, time) SELECT 3, DATEADD(MINUTE, -5, GETDATE());
INSERT dbo.TimeTable(value, time) SELECT 4, DATEADD(MINUTE, -4, GETDATE());
INSERT dbo.TimeTable(value, time) SELECT 5, DATEADD(MINUTE, -3, GETDATE());
INSERT dbo.TimeTable(value, time) SELECT 6, DATEADD(MINUTE, -2, GETDATE());
INSERT dbo.TimeTable(value, time) SELECT 7, DATEADD(MINUTE, -1, GETDATE());
INSERT dbo.TimeTable(value, time) SELECT 8, GETDATE();

;WITH myTbl AS
(
SELECT 
time, value, RANK() OVER (PARTITION BY (DATEDIFF(Mi,0, time)/5) ORDER BY time desc) RK
FROM TimeTable
)

SELECT * FROM myTbl
WHERE RK <= 1
ORDER BY time DESC

DROP TABLE TimeTable

这将在每个5分钟的间隔内返回最近的记录。