Sql server 将具有特定值的列更新为具有相同id的另一列上的最大值的值

Sql server 将具有特定值的列更新为具有相同id的另一列上的最大值的值,sql-server,sql-update,Sql Server,Sql Update,已经在另一个问题中提出了这个问题,但标准已更改 我的桌子: ID | NumDate | Number ------------------- | 1 | 20150101 | 0x | 1 | 20140101 | 12345678 | 1 | 20130101 | 12345 | 2 | 20150101 | 0x | 2 | 20130101 | 0x | 2 | 20091111 | 242424 | 3 | 20150101 | 88888 | 3 | 20141010 | 888

已经在另一个问题中提出了这个问题,但标准已更改

我的桌子:

 ID | NumDate  | Number
-------------------
| 1 | 20150101 | 0x
| 1 | 20140101 | 12345678
| 1 | 20130101 | 12345
| 2 | 20150101 | 0x
| 2 | 20130101 | 0x
| 2 | 20091111 | 242424
| 3 | 20150101 | 88888
| 3 | 20141010 | 88888
| 4 | 20150101 | 0x
| 4 | 20141010 | 0x
| 5 | 20141010 | 0101010
| 5 | 20141010 | 0101010
| 5 | 20141010 | 0x
必须将每个“0x”更新为一个“Number”,其中最大的“NumDate”不是“0x”

如果不存在除“0x”以外的其他值,则不进行更新

所需结果:

ID  | NumDate   | Number
-------------------
| 1 | 20150101 | 12345678      <-- ID = 1, Updated
| 1 | 20140101 | 12345678
| 1 | 20130101 | 12345
| 2 | 20150101 | 242424        <-- ID = 2, Updated
| 2 | 20130101 | 242424        <-- ID = 2, Updated
| 2 | 20091111 | 242424
| 3 | 20150101 | 88888         <- No change on id = 3, '88888' on both rows
| 3 | 20141010 | 88888         <- No change on id = 3, '88888' on both rows
| 4 | 20150101 | 0x            <- No change, there's no *better* 'Number' 
| 4 | 20141010 | 0x            <- No change, there's no *better* 'Number'
| 5 | 20141010 | 0101010
| 5 | 20141010 | 0101010 
| 5 | 20141010 | 0101010       <-- Updated
我确实看到了使用聚合函数时的错误。不适合这里吗

现在,我不知道如何处理这个问题。 也许我应该将“ID”、“Numdate”和“Number”复制到另一个表中,并使用JOIN进行更新,以保持简单?有人举个例子吗

或者也许有一种方法可以在现有的表中实现它

任何帮助都将不胜感激,
提前谢谢

尝试在您的CTE中按编号添加分组,并删除最后一次加入


我认为最好的解决方案是使用交叉应用:

;WITH CTE AS (
    SELECT t1.Number, t2.Number as NewNumber
    FROM TEST_03 t1
    CROSS APPLY
    (
       SELECT top 1 Number 
       FROM TEST_03
       WHERE
         t1.ID = ID
         and Number <> '0X'
       ORDER BY NumDate DESC
    ) t2
    WHERE t1.Number = '0X'
)
UPDATE CTE
SET Number = NewNumber

像这样的方法应该会奏效:

update t3
set Number = t1.Number
from dbo.test t3 join dbo.test t1 on t3.id = t1.id
join
(
select id, max(numDate) as maxdate
from dbo.test
where number<>'0x'
group by id
) t2
on t1.id = t2.id and t1.NumDate = t2.maxdate
where t3.number = '0x'

这与我的回答不同。找到我的答案的最后一次编辑,这很好。顺便问一下,为什么第三行的值会更新为12345678?根据您的逻辑,仅应更新编号为0x的行。如果为True,则不会编辑第三行。编辑的问题。尝试了这个。未找到“0x”行。记录计数:0和0行影响编辑使用您提供的示例数据在我的末尾工作。在问题上出错,第2行和第3行的“编号”不同。子查询为id=1提供了两条记录,这可能会阻止所有更新?请参见:这是您提供的精确样本数据和输出。正确。在我的真实数据库中,我有很多其他的专栏。你们认为这就是我得到结果“0行受影响”的原因吗?在问题上犯了一个错误,第2行和第3行有不同的“数字”。子查询为id=1提供了两条记录,可能这阻止了所有更新?@Kaptah这不会返回2行,它将从最新日期中获取1个数字,如果最新日期有2个条目,它将选择一个任意数字。
;WITH CTE AS (
SELECT ID, Number, Max(NumDate) NumDate
FROM TEST_03
WHERE Number <> '0X'
GROUP BY ID, Number
)
UPDATE ut SET Number = c.Number
FROM TEST_03 ut
    JOIN CTE c ON ut.ID = c.ID
WHERE ut.Number = '0X'
;WITH CTE AS (
    SELECT t1.Number, t2.Number as NewNumber
    FROM TEST_03 t1
    CROSS APPLY
    (
       SELECT top 1 Number 
       FROM TEST_03
       WHERE
         t1.ID = ID
         and Number <> '0X'
       ORDER BY NumDate DESC
    ) t2
    WHERE t1.Number = '0X'
)
UPDATE CTE
SET Number = NewNumber
update t3
set Number = t1.Number
from dbo.test t3 join dbo.test t1 on t3.id = t1.id
join
(
select id, max(numDate) as maxdate
from dbo.test
where number<>'0x'
group by id
) t2
on t1.id = t2.id and t1.NumDate = t2.maxdate
where t3.number = '0x'