我有一个数据表 - 一个大,具有耗电量值。
有时,由于毛刺,该值小于之前的记录,这会在处理时导致问题。
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解决方案,那就太棒了!
答案 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
查询中不能同时拥有join
和update
。因此,要么在update
之前定义变量,要么进行一些字符串到数字的转换。