我有以下SQL Server 2008表:
ID Destination Last Result 01 (555) 319-5170 Disconnect 02 (555) 319-5170 Duplicate 03 (555) 319-5170 Duplicate 04 (555) 261-5000 Duplicate 05 (555) 261-5000 Duplicate 06 (555) 261-7325 Busy 07 (555) 261-7325 Duplicate 08 (555) 261-7345 No Answer 09 (555) 261-7345 Duplicate
我的目标是为所有匹配的电话号码动态设置“上次结果”列。因此,在上面的目的地((555)319-5170)的示例表中,所有匹配电话号码(555)319-5170)的结果值为“Disconnect”。示例更新语句如下:
UPDATE C SET [Last Result] = ( SELECT Destination FROM Call WHERE [Last Result] NOT IN ('Duplicate','No Phone #') GROUP BY Destination HAVING COUNT(Destination) > 1) FROM Call C INNER JOIN ( SELECT Destination FROM Call WHERE [Last Result] NOT IN ('Duplicate','No Phone #') GROUP BY Destination HAVING COUNT(Destination) > 1 ) Dup ON Dup.Destination = C.Destination WHERE C.[Last Result] NOT IN ('Duplicate','No Phone #')
但是我收到了一个错误:
Msg 512,Level 16,State 1,Line 1
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
**EXPECTED OUTPUT**: ID Destination Last Result 01 (555) 319-5170 Disconnect 02 (555) 319-5170 Disconnect 03 (555) 319-5170 Disconnect 04 (555) 261-5000 Duplicate 05 (555) 261-5000 Duplicate 06 (555) 261-7325 Busy 07 (555) 261-7325 Busy 08 (555) 261-7345 No Answer 09 (555) 261-7345 No Answer
提前感谢您寻求可能解决方案的任何帮助。
答案 0 :(得分:1)
您可以使用Last Result
窗口功能查找第一个row_number()
。但是,必须有一种方法来定义“第一”。在示例中,我假设您有一个identity
列:
update t1
set [Last Result] = t2.[Last Result]
from Table1 t1
join (
select row_number() over (partition by Destination
order by Id) as rn
, *
from Table1
) t2
on t1.Destination = t2.Destination
and t2.rn = 1;
如果您没有标识列,请使用如何定义“first”更新问题。例如,可能有一个CreateDt
列。