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'