Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL更新不同列的最新行_Sql_Sql Server_Select - Fatal编程技术网

SQL更新不同列的最新行

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

我想为每个唯一材质设置上次修改的SGNumber=2

起始表:

预期结果:

如果有帮助的话,我做了一个select查询,只选择每个MaterialNo中最新的一行,这是我想要更新的行

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;