根据前一行中的值计算列值

时间:2011-09-16 06:08:45

标签: mysql

(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构造)。

因此,任务是计算连续行之间的某种“有限差异”。我已经阅读了有关子查询的内容,并认为它们可能是某种方式,但是在创建完成任务时却没有成功。最好的方法是什么?

2 个答案:

答案 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条目给我前一行。我必须这样做两次以获得值和时间戳 - 其余的是使用您给出的公式的简单数学。