仅更新具有共享/相似值的行



OK -我有一个简单的表-下面-我想做的是识别只有那些行有一个共享的值-所以任何有一个共享的"apc"值- do x else do Y

CREATE TABLE #test (hcpcs varchar(10), apc varchar(100), rate money) 
INSERT INTO #test (hcpcs, apc)
SELECT '97110', '8009'
UNION ALL
SELECT '71020', '8009'
UNION ALL
SELECT '85025', '8006'

所以-从上面-所有共享"8009"的行-我将对这些行进行更新-它们将共享相同的"rate"。带有"8006"的行将不会是该更新的一部分

你想:

WHERE EXISTS (SELECT *
     FROM #test t2
     WHERE t2.apc = #test.apc
     AND t2.hcpcs != #test.hcpcs)

确保apc被索引,这样可以有效地完成。

在我看来,获得所有期望结果的最舒适的方法是使用SQL-Server的OVER子句。

select *, count(*) over (partition by apc) as CNT
from #test order by CNT desc

将返回所有行以及重复的信息(使用order子句只是为了方便您执行此操作)。

要将其转换为更新,我将使用CTE:

with T1 as (select hcpcs, count(*) over (partition by apc) as CNT
    from #test)
update #test
set rate=@newrate
from #test inner join t1 on #test.hcpcs=T1.hcpcs
where CNT > 1

(请注意order by子句必须消失-这在CTE中是不允许的,并且无论如何都是无用的:))

只要改变你想要的CASE表达式。您可以使用OUTPUT子句来检查它的功能,然后在实际查询中删除它。

UPDATE T 
SET rate = CASE WHEN SRC.CNT > 1 THEN rate*5.00 ELSE rate*2.00 END
OUTPUT inserted.apc, deleted.rate old_rate, inserted.rate NEW_rate -- This is just to show results for testing
FROM #test T
JOIN (SELECT apc, COUNT(*) CNT
     FROM #test
     GROUP BY apc) SRC ON SRC.apc = T.apc

最新更新