1

我正在使用 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      |
+-------+-----------+`

并用以前的值删除零。有什么技巧可以做到吗?

4

3 回答 3

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。

于 2013-10-28T12:21:03.153 回答
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;
    }
}

如果连续有多个失败的读数,这将起作用,但如果第一个结果失败,仍然会给出零。

您可能还想做一些更高级的事情,比如检查上一个结果和下一个结果,然后取两者的平均值。

于 2013-10-28T11:52:52.037 回答
0

在mysql中

  UPDATE mytable
    SET kwhg = (@n := COALESCE(number, @n))
    ORDER BY time;



 @n is a MySQL user variable
于 2013-10-28T11:55:32.100 回答