(DB:MySQL 5)
我有一个名为“data”的表,其结构如下:
timestamp value delta
1234535853 12
1234535934 64
1234536700 22
未设置delta列,我想将其设置为
delta(n) = (value(n) - value(n-1)) / (timestamp(n) - timestamp(n-1))
其中n是相应的行号(虽然我没有行号索引!“前一行”是具有下一个较低时间戳的行,因为(根据我的研究)MySQL不支持ROWNUM构造)。
因此,任务是计算连续行之间的某种“有限差异”。我已经阅读了有关子查询的内容,并认为它们可能是某种方式,但是在创建完成任务时却没有成功。最好的方法是什么?
答案 0 :(得分: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
列上创建唯一索引,上述查询会快得多!
答案 1 :(得分: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条目给我前一行。我必须这样做两次以获得值和时间戳 - 其余的是使用您给出的公式的简单数学。