我需要什么。一个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创建历史温度和湿度的折线图。
答案 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分钟的间隔内返回最近的记录。