2011-09-16 60 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