SQL更新不同列的最新行
我想为每个唯一材质设置上次修改的SGNumber=2 起始表: 预期结果: 如果有帮助的话,我做了一个select查询,只选择每个MaterialNo中最新的一行,这是我想要更新的行SQL更新不同列的最新行,sql,sql-server,select,Sql,Sql Server,Select,我想为每个唯一材质设置上次修改的SGNumber=2 起始表: 预期结果: 如果有帮助的话,我做了一个select查询,只选择每个MaterialNo中最新的一行,这是我想要更新的行 select distinct MaterialeNo, max(SGNumber) as tag from Mydatabase group by MaterialeNo 将表连接到获取最大LastModified值的查询: update m set m.SGNumber = 2 from Mydatabas
select distinct MaterialeNo, max(SGNumber) as tag
from Mydatabase
group by MaterialeNo
将表连接到获取最大LastModified值的查询:
update m
set m.SGNumber = 2
from Mydatabase m inner join (
select MaterialeNo, max(LastModified) as MaxLastModified
from Mydatabase
group by MaterialeNo
) t on t.MaterialeNo = m.MaterialeNo and t.MaxLastModified = m.LastModified
看。
结果:
用这个。使用您的行ID以确保具有相同LastModified和MaterialNo的项目不会得到更新
Update MyDatabase
Set SGNumber = 2
FROM
(select t1.id from
(select id, row_number() over (partition by MaterialNo order by LastModified desc) rownum from MyDatabase) t1
Where t1.rownum = 1) t2
WHERE MyDatabase .id = t2.id
如果您使用的是MS SQL Server,您可以使用行号进行操作,它将计算相同的项目,并为id设置订单号。在您的情况下,我显示您在se末尾有最新的日期,您只需完成即可 所以你可以检查我为你做的这个样品 声明@Mydatabase表Id int identity1,1,MaterialNo varchar20,LastModified datetime,SGNumber int 在@Mydatabase values'TEST 1'中插入'2019.07.05',1 在@Mydatabase values'TEST 1','2019.07.06',1中插入 插入@Mydatabase值“测试2”,“2019.07.04”,1 插入@Mydatabase值“测试2”,“2019.07.05”,1 选择Id、物料号、上次修改的、SGNumber、行号(按物料)按上次修改的ASC编号按订单超额分配 来自@Mydatabase 后果 使用可更新的CTE和行号:
将查询结果插入临时表tmpsample,然后通过将临时表连接到主表来更新表。如果在同一日期有重复的物料号怎么办?如果id=5,物料号=test2,LastModified=05/07/2019 00:00:00怎么办?因此将更新2条记录?要求是:我想为每个材质的最新LastModified设置SGNumber=2。如果有两行相同的材料有相同的LastModified,我想OP会提到。实际上我需要更新表,而不是选择。这不会更新表本身。但在我的压力下我可能不太清楚,我感谢你的回答
Update MyDatabase
Set SGNumber = 2
FROM
(select t1.id from
(select id, row_number() over (partition by MaterialNo order by LastModified desc) rownum from MyDatabase) t1
Where t1.rownum = 1) t2
WHERE MyDatabase .id = t2.id
Id MaterialNo LastModified SGNumber Numbering
-- ---------- ----------------------- -------- ---------
1 TEST 1 2019-07-05 00:00:00.000 1 1
2 TEST 1 2019-07-06 00:00:00.000 1 2
3 TEST 2 2019-07-04 00:00:00.000 1 1
4 TEST 2 2019-07-05 00:00:00.000 1 2
with toupdate as (
select t.*,
row_number() over (partition by MaterialNo order by LastModified desc) as rownum
from mydatabase t
)
update toupdate
set sgnumber = 2
where seqnum = 1;