用最后一个有效值Mysql替换零

时间:2013-10-28 11:45:18

标签: php mysql sql

我正在使用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值删除零。 有什么技巧吗?

3 个答案:

答案 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