MySQL:按序列号 (SN) 计算连续行之间的能耗差异
本文档概述了一种计算 MySQL 数据库中连续行之间能耗差异的方法,按序列号 (SN) 分组。
问题:
给定一个包含能源消耗数据的表,目标是计算每个 SN 的消耗差异,表示该特定 SN 当前值与先前值之间的变化。
示例数据:
下表 (EnergyLog
) 说明了初始数据结构:
SN | Date | Value |
---|---|---|
2380 | 2012-10-30 00:15:51 | 21.01 |
2380 | 2012-10-31 00:31:03 | 22.04 |
2380 | 2012-11-01 00:16:02 | 22.65 |
2380 | 2012-11-02 00:15:32 | 23.11 |
20100 | 2012-10-30 00:15:38 | 35.21 |
20100 | 2012-10-31 00:15:48 | 37.07 |
20100 | 2012-11-01 00:15:49 | 38.17 |
20100 | 2012-11-02 00:15:19 | 38.97 |
20103 | 2012-10-30 10:27:34 | 57.98 |
20103 | 2012-10-31 12:24:42 | 60.83 |
期望输出:
查询应生成一个添加了 Consumption
列的表:
SN | Date | Value | Consumption |
---|---|---|---|
2380 | 2012-10-30 00:15:51 | 21.01 | 0.00 |
2380 | 2012-10-31 00:31:03 | 22.04 | 1.03 |
2380 | 2012-11-01 00:16:02 | 22.65 | 0.61 |
2380 | 2012-11-02 00:15:32 | 23.11 | 0.46 |
20100 | 2012-10-30 00:15:38 | 35.21 | 0.00 |
20100 | 2012-10-31 00:15:48 | 37.07 | 1.86 |
20100 | 2012-11-01 00:15:49 | 38.17 | 1.10 |
20100 | 2012-11-02 00:15:19 | 38.97 | 0.80 |
20103 | 2012-10-30 10:27:34 | 57.98 | 0.00 |
20103 | 2012-10-31 12:24:42 | 60.83 | 2.85 |
SQL 解决方案:
以下 SQL 查询利用用户定义的变量来实现所需的结果:
<code class="language-sql">SELECT EL.SN, EL.Date, EL.Value, IF(@lastSN = EL.SN, EL.Value - @lastValue, 0.00) AS Consumption, @lastSN := EL.SN, @lastValue := EL.Value FROM EnergyLog EL, (SELECT @lastSN := 0, @lastValue := 0) AS SQLVars ORDER BY EL.SN, EL.Date;</code>
说明:
@lastSN
和 @lastValue
:这些是初始化为 0 的用户定义变量。@lastSN
跟踪最后处理的 SN,@lastValue
存储最后处理的值。IF(@lastSN = EL.SN, EL.Value - @lastValue, 0.00)
:此条件语句检查当前 SN 是否与之前的 SN 相同。如果为true,则计算消耗差额;否则,它将消耗设置为 0.00(对于每个 SN 的第一个条目)。@lastSN := EL.SN, @lastValue := EL.Value
:这些赋值在处理每一行后更新用户定义的变量。ORDER BY EL.SN, EL.Date
:此子句确保按正确的顺序处理行(先按 SN,然后按日期)以进行准确的差异计算。该方法利用MySQL的变量处理能力,有效计算每个SN的能耗差异。 ORDER BY
的使用对于结果的正确性至关重要。
以上是如何通过SN计算MySQL中连续行之间的能耗差异?的详细内容。更多信息请关注PHP中文网其他相关文章!