Sql 如果两行中的一列中有相同的值,则使用一行中的相同值更新另一列

Sql 如果两行中的一列中有相同的值,则使用一行中的相同值更新另一列,sql,sql-server,Sql,Sql Server,在MS SQL server management studio中编写SQL 我现在有这个问题,我有一个表,其中每行有两个几乎相同的值: code | name | location | group 1 | Thing | 1 | 1 1 | Thing | 2 | NULL 我需要更新空组以匹配具有值的组,其中代码相同 目前以这种形式: code Locationid ItemGroup2 100001

在MS SQL server management studio中编写SQL

我现在有这个问题,我有一个表,其中每行有两个几乎相同的值:

code  |   name   | location  |  group
1     |   Thing  |  1        |  1
1     |   Thing  |  2        |  NULL
我需要更新空组以匹配具有值的组,其中代码相同

目前以这种形式:

code    Locationid  ItemGroup2
100001  1           TTE
100001  2           NULL
100002  1           TTG
100002  2           NULL
我想更新表以匹配:

code    Locationid  ItemGroup2
100001  1           TTE
100001  2           TTE
100002  1           TTG
100002  2           TTG

这里有一个选项
将表连接到自身:

update t1
set grp = t2.grp
from yourtable t1
  join yourtable t2 on t1.code = t2.code and t2.grp is not null
where t1.grp is null

这里有一个选项
将表连接到自身:

update t1
set grp = t2.grp
from yourtable t1
  join yourtable t2 on t1.code = t2.code and t2.grp is not null
where t1.grp is null

一种方法使用窗口函数:

with toupdate as (
      select t.*, max(grp) over (partition by code) as maxgrp
      from t
     )
update toupdate
    set grp = maxgrp
    where grp is null;

一种方法使用窗口函数:

with toupdate as (
      select t.*, max(grp) over (partition by code) as maxgrp
      from t
     )
update toupdate
    set grp = maxgrp
    where grp is null;

对于每个
代码
,此UPDATE语句应该找到
的第一个非空值,因此它应该比简单地假设只有一个非空值更可靠

UPDATE b
SET b.[group]=a.[group]
FROM MyTable b
JOIN (
    SELECT [code], [group], ROW_NUMBER() OVER(PARTITION BY [code]) as rk
    FROM MyTable WHERE [group] IS NOT NULL
) a ON a.[code]=b.[code] AND a.[rk]=1

对于每个
代码
,此UPDATE语句应该找到
的第一个非空值,因此它应该比简单地假设只有一个非空值更可靠

UPDATE b
SET b.[group]=a.[group]
FROM MyTable b
JOIN (
    SELECT [code], [group], ROW_NUMBER() OVER(PARTITION BY [code]) as rk
    FROM MyTable WHERE [group] IS NOT NULL
) a ON a.[code]=b.[code] AND a.[rk]=1

如果每个代码存在多个非空组,它应该使用哪一个呢?每个代码行有两个,位置为1和2。位置1有一个非空组,位置2有一个空组。更新了问题。如果每个代码存在多个非空组,它应该使用哪一个?每个代码行有两个,位置1和2。位置1具有非空组,位置2具有空组。已更新问题。