SQL查询使值单调?

时间:2015-05-27 15:44:41

标签: php mysql

我有一个数据表 - 一个,具有耗电量值。

有时,由于毛刺,该值小于之前的记录,这会在处理时导致问题。

monday    143 kWh
tuesday   140 kWh *glitch*
wednesday 150 kWh

我想让桌子单调。我有兴趣找出是否有一个SQL查询将每个glitched值设置为前一个最大值。

这可以不用PHP吗?

该表格式如下(稍微简化一下):

CREATE TABLE IF NOT EXISTS `history` (
  `day` int(11) NOT NULL,
  `value` float NOT NULL
)

我知道如何在PHP中逐行执行此操作,但如果有一个更简洁的SQL解决方案,那就太棒了!

1 个答案:

答案 0 :(得分:1)

您希望序列是"单调"。 "单调"意味着无聊。

如果您有大量数据,那么最有效的方法是使用变量:

select h.day,
       (@max := greatest(@max, h.value)
from history h cross join
     (select @max := -1) params
order by h.day;

如果您确实想要更新值,那么您可以做同样的事情:

update history h
    set value = (@max := greatest(coalesce(@max + 0, 0), h.value)
    order by h.day;

请注意,在这种情况下,@max默认为字符串变量。您在order by查询中不能同时拥有joinupdate。因此,要么在update之前定义变量,要么进行一些字符串到数字的转换。