SQL将一列更新为不带键的最大值
我在表格中有以下数据SQL将一列更新为不带键的最大值,sql,stored-procedures,sql-server-2014,Sql,Stored Procedures,Sql Server 2014,我在表格中有以下数据 ID name code number 621 eric 10PT 1 676 eric 10PT 1 679 eric 10PT 1 我需要编写一条update语句,将ID更新为该特定数据组的最大值。列不是键,整个表不包含任何键 结果: ID name code number 679 eric 10PT 1 679 eric 10PT 1 679 eric 10PT 1 我忘了补充
ID name code number
621 eric 10PT 1
676 eric 10PT 1
679 eric 10PT 1
我需要编写一条update语句,将ID更新为该特定数据组的最大值。列不是键,整个表不包含任何键
结果:
ID name code number
679 eric 10PT 1
679 eric 10PT 1
679 eric 10PT 1
我忘了补充一下,表中有更多这样的组。update语句必须同时覆盖所有组
有人知道吗?在这种情况下,我会使用
CTE
来执行更新
:
Update t1
set id=t2.maxid
from mytable t1
inner join
(select max(id)as maxid,name, code, number from mytable group by name, code, number) t2
on t2.name=t1.name and t1.code=t2.code and t2.number=t1.number
;WITH ToUpdate AS (
SELECT ID,
MAX(ID) OVER (PARTITION BY name, code, number) AS max_ID
FROM mytable
)
UPDATE ToUpdate
SET ID = max_ID
更新将传播到数据库中的实际记录。CTE
使用窗口版本的MAX
来获取每个名称、代码、编号
组中的最大ID
值。我使用了子查询和交叉连接来更新ID字段
update t set id = m.mid
from myTable t
cross apply (select max(id) as mid from myTable) m
您正在使用哪些RDBMS?此外,哪些字段确定特定组?MSSQL server 2014。ID、名称、代码和编号确定特定的组。表中有更多的列,但这些列决定了组。如果有帮助,请接受我的回答?我将在以后删除此注释。此查询中没有组确定。因此,如果一个组存在更多,它将失败。与另一个查询一样,它没有组确定。这很好,就像一个缺陷。谢谢分区中的某些列可以包含空值,这将创建其他分区。我不想那样。我不知道如何忽略PARTITION BY语句中的空值。有什么想法吗?@ImperialBert您想如何处理NULL
s?完全无视他们?然后包括一个WHERE
子句以过滤掉这些记录。否则,您能否指定一个用例以及预期结果?感谢您的快速回复!我想忽略空值。例如,如果名称和代码相同,但数字为NULL,则此分区仍应更新为max_ID。我希望这有意义?@ImperialBert如果您有(名称、代码、数字)=('eric',10PT',1),('eric',10PT',2),('eric',10PT',NULL)
,该怎么办。在这种情况下,如何为最后一条记录找到匹配的分区?
update t set id = m.mid
from myTable t
cross apply (select max(id) as mid from myTable) m