根据列更新具有不同值的表

时间:2021-01-07 12:33:41

标签: sql sql-server tsql

我有一张桌子:

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。

1 个答案:

答案 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。

相关问题