1

我有以下 SQL Server 2008 表:

ID 目的地 最后结果
01 (555) 319-5170 断开连接
02 (555) 319-5170 重复
03 (555) 319-5170 重复
04 (555) 261-5000 重复
05 (555) 261-5000 重复
06 (555) 261-7325 忙
07 (555) 261-7325 重复
08 (555) 261-7345 无应答
09 (555) 261-7345 重复

我的目标是为所有匹配的电话号码动态设置“最后结果”列。因此,在上面的 Destination((555) 319-5170) 示例表中,所有匹配电话号码 (555) 319-5170) 的结果为“断开连接”。示例更新语句如下:

    更新 C
    SET [最后结果] = (
    选择目的地
                从呼叫
                WHERE [Last Result] NOT IN('重复','没有电话号码')
                按目的地分组
                HAVING COUNT(目的地) > 1)
    FROM 呼叫 C
    内部联接
            (
                选择目的地
                从呼叫
                WHERE [Last Result] NOT IN('重复','没有电话号码')
                按目的地分组
                HAVING COUNT(目的地) > 1
            ) Dup ON Dup.Destination = C.Destination
    WHERE C.[Last Result] NOT IN ('Duplicate','No Phone #')

但我收到一个错误:

消息 512,级别 16,状态 1,第 1 行
子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

**预期输出**:

ID 目的地 最后结果
01 (555) 319-5170 断开连接
02 (555) 319-5170 断开连接
03 (555) 319-5170 断开连接
04 (555) 261-5000 重复
05 (555) 261-5000 重复
06 (555) 261-7325 忙
07 (555) 261-7325 忙
08 (555) 261-7345 无应答
09 (555) 261-7345 无应答

提前感谢您提供可能的解决方案的任何帮助。

4

1 回答 1

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;

SQL Fiddle 的示例。

如果您没有身份列,请用您如何定义“第一”来更新问题。例如,可能有一个CreateDt列。

于 2013-02-12T15:20:12.193 回答