我有一张桌子:
ProductCode Date Number
COD666AN 2020-12-18 12:02:47.330 5
COD666AN 2020-12-18 12:02:47.770 6
COD666AN 2020-12-18 12:18:05.587 7
COD666AN 2020-12-18 15:13:08.993 8
COD666AN 2020-12-18 15:13:09.400 9
COD666AN 2020-12-18 15:31:39.497 20000000
COD666AN 2020-12-23 11:12:06.140 10
COD666AN 2020-12-23 11:14:06.720 11
COD666AN 2020-12-23 11:14:52.957 12
COD666AN 2020-12-23 11:14:53.360 13
COD666AN 2020-12-23 11:16:49.673 30000000
我试图更新列“数字”以获得如下结果:
ProductCode Date Number
COD666AN 2020-12-18 12:02:47.330 20000000
COD666AN 2020-12-18 12:02:47.770 20000000
COD666AN 2020-12-18 12:18:05.587 20000000
COD666AN 2020-12-18 15:13:08.993 20000000
COD666AN 2020-12-18 15:13:09.400 20000000
COD666AN 2020-12-18 15:31:39.497 20000000
COD666AN 2020-12-23 11:12:06.140 30000000
COD666AN 2020-12-23 11:14:06.720 30000000
COD666AN 2020-12-23 11:14:52.957 30000000
COD666AN 2020-12-23 11:14:53.360 30000000
COD666AN 2020-12-23 11:16:49.673 30000000
我想避免游标,但如果没有办法避免它们也无所谓。
注意:我的表可以有更多的“块”(我称块是较大数字之间的日期),例如.... 14, 15, 16, 17 , 40000000 .....
逻辑:如您所见,该表按列 [Date] asc 排序,因此我想在下一个更高的列之前使用与列 [Number] 的最大值相同的值更新列 [Number]值,以便使 20000000 之前的所有值等于 20000000 和 30000000 之前但不等于 20000000 之前的所有值等于 30000000。
答案 0 :(得分:2)
我只能推测逻辑。看起来您想要累积(以相反顺序)分钟,其中 number
高于阈值:
select t.*,
min(case when number > 10000 then number end) over (partition by productcode order by date desc) as imputed_number
from t;
然后您可以在更新中使用它:
with toupdate as (
select t.*,
min(case when number > 10000 then number end) over (partition by productcode order by date desc) as imputed_number
from t
)
update toupdate
set number = imputed_number
where number <> imputed_number;
Here 是一个 db<>fiddle。