2013-04-02 143 views
0

我有一個非常大的表,我有溫度每隔1分鐘記錄一次,我想查詢的是一個趨勢;類似的百分比增幅或每個週期選擇的百分比下降(小時或15分鐘;根據查詢)Mysql查詢獲取溫度趨勢

我的表如下(例如)像下面

ID  time    temp 
119950 2013-03-27 07:56:05 27.25 
119951 2013-03-27 07:57:05 27.50 
119952 2013-03-27 07:58:05 27.60 
119953 2013-03-27 07:59:05 27.80 
119954 2013-03-27 08:00:05 27.70 
119955 2013-03-27 08:01:05 27.50 
119956 2013-03-27 08:02:05 27.25 
119957 2013-03-27 08:03:05 27.10 
119958 2013-03-27 08:04:05 26.9 
119959 2013-03-27 08:05:05 27.1 
119960 2013-03-27 08:06:05 27.25 
119961 2013-03-27 08:07:05 27.6 

我相信一個趨勢可以如下計算(根據link),但糾正我,如果你有更好的方法; 取各行之間的差值再加上再除以計數。所以對於上表,我們得到

Diff 
+0.25 
+0.10 
+0.20 
-0.10 
-0.20 
-0.25 
-0.15 
-0.20 
+0.20 
+0.15 
+0.35 

最近11分鐘的每分鐘趨勢是diff/11的總和。在過去的11分鐘內每分鐘可達0.063C。

有人可以幫助我獲得最近3小時每小時的百分比趨勢。和1分鐘的每分鐘趨勢?

+1

觀察到的所有這些差異的總和等於之間的差異初始值和最終值。因此百分比變化可以從'final/initial - 1'獲得 - 例如, '27.6/27.25 - 1 = = + 1.28%'。 – eggyal

+0

謝謝,但上表只是一個例子。這是一個例外。一般來說這些數值將會遍佈整個地方,所有差異的總和不會等於初始和最終之間的差異。 – Ossama

+2

否 - 由於加法的相關性,所有差異的總和將總是*等於初始和最終之間的差異。 – eggyal

回答

2
CREATE TABLE temperature_log 
(ID  INT NOT NULL,dt DATETIME NOT NULL, temperature DECIMAL(5,2) NOT NULL); 

INSERT INTO temperature_log VALUES 
(119950 ,'2013-03-27 07:56:05',27.25), 
(119951 ,'2013-03-27 07:57:05', 27.50), 
(119952 ,'2013-03-27 07:58:05', 27.60), 
(119953 ,'2013-03-27 07:59:05', 27.80), 
(119954 ,'2013-03-27 08:00:05', 27.70), 
(119955 ,'2013-03-27 08:01:05', 27.50), 
(119956 ,'2013-03-27 08:02:05', 27.25), 
(119957 ,'2013-03-27 08:03:05', 27.10), 
(119958 ,'2013-03-27 08:04:05', 26.9), 
(119959 ,'2013-03-27 08:05:05', 27.1), 
(119960 ,'2013-03-27 08:06:05', 27.25), 
(119961 ,'2013-03-27 08:07:05', 27.6); 

SELECT x.* 
    , x.temperature - y.temperature diff 
    , COUNT(*) cnt 
    ,(x.temperature-y.temperature)/COUNT(*) trend 
    FROM temperature_log x 
    JOIN temperature_log y 
    ON y.id < x.id 
GROUP 
    BY x.id; 
+--------+---------------------+-------------+-------+-----+-----------+ 
| ID  | dt     | temperature | diff | cnt | trend  | 
+--------+---------------------+-------------+-------+-----+-----------+ 
| 119951 | 2013-03-27 07:57:05 |  27.50 | 0.25 | 1 | 0.250000 | 
| 119952 | 2013-03-27 07:58:05 |  27.60 | 0.35 | 2 | 0.175000 | 
| 119953 | 2013-03-27 07:59:05 |  27.80 | 0.55 | 3 | 0.183333 | 
| 119954 | 2013-03-27 08:00:05 |  27.70 | 0.45 | 4 | 0.112500 | 
| 119955 | 2013-03-27 08:01:05 |  27.50 | 0.25 | 5 | 0.050000 | 
| 119956 | 2013-03-27 08:02:05 |  27.25 | 0.00 | 6 | 0.000000 | 
| 119957 | 2013-03-27 08:03:05 |  27.10 | -0.15 | 7 | -0.021429 | 
| 119958 | 2013-03-27 08:04:05 |  26.90 | -0.35 | 8 | -0.043750 | 
| 119959 | 2013-03-27 08:05:05 |  27.10 | -0.15 | 9 | -0.016667 | 
| 119960 | 2013-03-27 08:06:05 |  27.25 | 0.00 | 10 | 0.000000 | 
| 119961 | 2013-03-27 08:07:05 |  27.60 | 0.35 | 11 | 0.031818 | 
+--------+---------------------+-------------+-------+-----+-----------+ 

順便說一句,如果你有興趣獲得每小時平均結果,你可以做這樣的事情...

SELECT DATE_FORMAT(x.dt,'%Y-%m-%d %h:00:00') 
    , AVG(x.temperature) avg_temp 
    FROM temperature_log x 
GROUP 
    BY DATE_FORMAT(x.dt,'%Y-%m-%d %h:00:00'); 
+0

謝謝,但是因爲我有100個價值觀,你能插入一個過濾器來獲得每小時3小時的溫度嗎? – Ossama

+0

是的,但這是一個不同的問題。如果不先修改問題(或接受問題,然後再問問新問題),修改答案是不恰當的。 – Strawberry

+0

我真的很感謝你的幫助,謝謝:)。我原來的問題確實提到了這一點,因爲我有這麼多的數據;我看不出你的答案是否有效,如果是這樣的話,那麼將會取得所有結果。 – Ossama