Sql 根据列使用不同的值更新表

Sql 根据列使用不同的值更新表,sql,sql-server,tsql,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.9

我有一张桌子:

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
我想避免使用光标,但如果没有办法避免,也没关系

注意:我的表可能有更多的块,我称之为块(blocks),以较高数字之间的日期为准,例如。。。。14、15、16、17、40000000


逻辑:正如您所看到的,表是按[Date]列asc排序的,因此我想在下一个更高的值之前,用[Number]列的最大值的相同值更新[Number]列,为了使2000万之前的所有值等于2000万,3000万之前的值等于3000万,但2000万之前的值不等于3000万。

我只能推测逻辑。看起来您想要一个倒序最小值的累积值,其中数值高于阈值:

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;

我只能推测逻辑。看起来您想要一个倒序最小值的累积值,其中数值高于阈值:

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;

是一个DBFIDLE。

请解释逻辑。什么决定数字列的初始值?您使用什么逻辑来确定填充块编号与要替换填充块的编号之间的差异?请解释逻辑。什么决定编号列的初始值?您使用什么逻辑来确定填充块编号与要替换填充块的编号之间的差异?查询失败。它不喜欢min函数中的order by。问题可能是im使用的是SSMS 2019,但服务器是2008?您的SSMS版本无关紧要。问题是聚合窗口函数MIN、MAX等仅在SQL Server 2012+中可用。SQL Server 2008不再受支持。此代码适用于数据库的所有受支持版本。查询失败。它不喜欢min函数中的order by。问题可能是im使用的是SSMS 2019,但服务器是2008?您的SSMS版本无关紧要。问题是聚合窗口函数MIN、MAX等仅在SQL Server 2012+中可用。SQL Server 2008不再受支持。此代码适用于所有受支持的数据库版本。