2011-09-16 58 views
1

前述計算列值(DB:MySQL的5)取決於值行

我有一個表命名爲「數據」具有以下結構:

timestamp value delta 
1234535853 12 
1234535934 64 
1234536700 22 

增量列沒有被設置,並我想將它設置爲

delta(n) = (value(n) - value(n-1))/(timestamp(n) - timestamp(n-1)) 

其中n是各自的行數(我沒有行號指數,但!的「前行」是與下一個較低的時間戳列,因爲(根據我的研究)MySQL做的es不支持ROWNUM構造)。

因此,任務是計算連續行之間的一種「有限差分」。我已經閱讀了關於子查詢的內容,並認爲它們可能是以某種方式去做的方式,但是在創建一個完成任務的方面卻沒有成功。最好的辦法是什麼?

回答

1

使用

SELECT A.timestamp, A.value, ((A.value - D.value)/(A.timestamp - A.prevtimestamp)) AS delta 
FROM 
(SELECT X.timestamp, X.value, (SELECT MAX (S.timestamp) FROM data S WHERE S.timestamp < X.timestamp) AS prevtimestamp FROM data X) A, data D WHERE D.timestamp = A.prevtimestamp 
ORDER BY A.timestamp DESC 

當心:

既然你不給有關表結構等上面的查詢很多細節,如果timestamp不是唯一的失敗。

順便說一句,你應該考慮使用其他列名,因爲這些列名很容易陷入困境(保留......)。

編輯 - 有關業績:

,如果你在timestamp列上創建唯一索引上面的查詢會快很多!

+0

謝謝,非常有用(特別是關於保留列名的評論;我不知道!)。 – Maximilian

+0

歡迎您...關於表演,請參閱我上面的編輯... – Yahia

0

這應該工作:

SELECT 
    timestamp, 
    value, 
    (
    (value - (SELECT value FROM data WHERE timestamp < d.timestamp ORDER BY timestamp DESC LIMIT 1)) 
    /
    (timestamp - (SELECT timestamp FROM data WHERE timestamp < d.timestamp ORDER BY timestamp DESC LIMIT 1)) 
) AS delta 
FROM 
    data AS d 
ORDER BY 
    timestamp 
在子選擇我只是通過時間戳訂購向後其中時間戳比當前行的一個較低

。限制爲1條目給我前面的行。我必須這樣做兩次才能獲得價值和時間戳 - 其餘部分與您提供的公式很簡單。

+0

這似乎是答案好,但我現在已經運行查詢(在我的本地數據庫服務器)15分鐘,它仍然沒有完成(表中約有900萬行)。任何想法如何我可以加快這一點?會添加行號索引有幫助嗎? – Maximilian