我有一个数据表-一个大的,有用电量值。
有时,由于出现故障,该值小于上一条记录,这会导致处理时出现问题。
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专用解决方案,那将是极好的!
最佳答案
你希望序列是“单调的”。“单调”意味着无聊。
如果有大量数据,那么最有效的方法是使用变量:
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
之前定义变量,要么进行一点字符串到数字的转换。关于php - SQL查询使值单调?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30487215/