[英]MySQL - SQL to skip intervals e.g. records every 5 minutes
我需要的。 一個SQL語句,它將查找最新的一條記錄,然后查找比該記錄的時間戳晚5分鍾的下一條記錄,並重復執行直到達到限制。 時間戳記是unix時間。 因此,獲取最新記錄,然后減去5分鍾,獲取該記錄並重復。 5分鍾就是一個例子。 實際上,它是從幾秒鍾到幾小時的變量。 我可以輕松地用Perl,Ruby或Bash編程某些東西,以便在內部進行選擇的情況下進行循環,但是希望使用一種更快的純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
因此,上面的腳本為我提供了我想要和控制的輸出。 但是我擔心大量的Selects會減慢速度。 我希望以每條記錄之間的不同間隔提取24小時,1周,1個月,1年的數據。 基本上持續24小時,每5分鍾拉一次。 對於1周的拉力,可能會有一對夫婦記錄一個小時等。數據全部輸入RGraph來創建歷史溫度和濕度的折線圖。
您可以嘗試運行以下代碼:
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分鍾返回一次最近的記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.