我正在使用mysql来存储我家的Kwh使用情况。我很少得到一个错误并获得一个0值来存储。当我从我的表中提取值时,我不希望得到那个0但是之前的最后一个有效值。
SELECT unix_timestamp(dataora) as time, kwhg
FROM misure
WHERE dataora BETWEEN '2013-10-08 00:00:00.000' AND '$data_scelta 23:59:59.997'
GROUP BY date(dataora),hour(dataora)
我使用上面的代码来获得下表:
+-------+-----------+
| time | kwhg |
+-------+-----------+
| 9 | 2 |
| 10 | 3 |
| 11 | 0 |
| 12 | 4 |
| 13 | 0 |
+-------+-----------+`
我想获得
+--------+----------+
| time | kwhg |
+-------+-----------+
| 9 | 2 |
| 10 | 3 |
| 11 | 3 |
| 12 | 4 |
| 13 | 4 |
+-------+-----------+`
并使用previus值删除零。 有什么技巧吗?
答案 0 :(得分:1)
如果大于零,您可以使用MySQL用户定义的变量返回当前行的kwhg
值,或者返回前一行定义的变量。
SELECT unix_timestamp(dataora) as time, @kwhg := IF(kwhg>0, kwhg, @kwhg) AS kwhg
FROM misure
WHERE dataora BETWEEN '2013-10-08 00:00:00.000' AND '$data_scelta 23:59:59.997'
GROUP BY date(dataora),hour(dataora)
与@ OddEssay的答案一样,如果第一个条目为零,则无法提供非零值。在这种情况下,它将返回@kwhg
的当前值,除非您在当前会话之前运行查询,否则它可能为NULL。
答案 1 :(得分:0)
如果它是一个小的结果集,你可以简单地循环它并创建一个固定的数据集,如:
$fixedResults = array();
$lastGoodReading = 0;
foreach($results as $row){
if($row['kwhg']){
$fixedResults[$row['time']] = $row['kwhg'];
$lastGoodReading = $row['kwhg'];
} else {
$fixedResults[$row['time']] = $lastGoodReading;
}
}
如果一行中有多个失败的读数,哪个会有效,但如果第一个结果失败,它仍会给出零。
你可能还想做一些更先进的事情,比如检查先前的结果和下一个结果,并取两者的平均值。
答案 2 :(得分:0)
在mysql中
UPDATE mytable
SET kwhg = (@n := COALESCE(number, @n))
ORDER BY time;
@n is a MySQL user variable