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不再受支持。此代码适用于所有受支持的数据库版本。