MySQL中按组计算消耗值:基于前一行的差值
在MySQL中,根据分组因子计算连续值之间的差值是很常见的任务。假设需要根据前一个值计算每个序列号(SN)的消耗值。
数据结构:
示例数据包含EnergyLog
表,其模式如下:
<code>SN | 日期 | 值</code>
预期结果:
目标是扩展表,添加“消耗”列,该列表示每个SN相对于前一行的“值”的差值。
解决方案:
MySQL变量提供了一种方便的方法来实现这一点。通过使用用户定义的变量(@lastSN
和@lastValue
),我们可以在迭代数据时跟踪前一个SN和值。
<code class="language-sql">-- 声明变量 SELECT EL.SN, EL.日期, EL.值, IF(@lastSN = EL.SN, EL.值 - @lastValue, 0.00) AS 消耗, @lastSN := EL.SN, @lastValue := EL.值 -- 来自表 FROM EnergyLog EL, (SELECT @lastSN := 0, @lastValue := 0) AS SQLVars -- 按分组因子SN和日期排序 ORDER BY EL.SN, EL.日期;</code>
解释:
FROM
子句声明变量(@lastSN
和@lastValue
)并将它们初始化为0。EnergyLog
表。@lastSN
进行比较。如果匹配,则计算当前值与前一个@lastValue
之间的消耗(差值)。@lastSN
和@lastValue
变量将更新到下一个迭代。输出:
SN | 日期 | 值 | 消耗 |
---|---|---|---|
2380 | 2012-10-30 | 21.01 | 0.00 |
2380 | 2012-10-31 | 22.04 | 1.03 |
2380 | 2012-11-01 | 22.65 | 0.61 |
2380 | 2012-11-02 | 23.11 | 0.46 |
20100 | 2012-10-30 | 35.21 | 0.00 |
20100 | 2012-10-31 | 37.07 | 1.86 |
20100 | 2012-11-01 | 38.17 | 1.10 |
20100 | 2012-11-02 | 38.97 | 0.80 |
20103 | 2012-10-30 | 57.98 | 0.00 |
20103 | 2012-10-31 | 60.83 | 2.85 |
以上是MySQL中如何通过上一行减去来计算消耗值?的详细内容。更多信息请关注PHP中文网其他相关文章!