我有一个SQL Server 2008表,其中包含多个组中的记录,包括复合组ID(即GroupID = Col1 + Col2 + Col3),需要将每个组随机分成控制组,仅为Col1重新分配值,这样每组的一半将保留在原始组中,一半将被放入一个新组中。如何在一个语句中执行此操作,以便我不必手动遍历每个Col2 + Col3组?
换句话说,我想做这样的事情:
UPDATE dbo.DM_Main
SET PkgPt1 = 'CD2'
WHERE ID IN (
SELECT TOP 50 PERCENT ID
FROM dbo.DM_Main
WHERE PkgPt1 = 'CD1'
GROUP BY PkgPt2, PkgPt3 -- obviously this line won't work
ORDER BY NEWID()
)
答案 0 :(得分:3)
这是一个想法。枚举每个组的行。然后将偶数(或奇数)的那些放在控制组中。您可以使用可更新的CTE在SQL Server中执行此操作:
with toupdate as (
select m.*,
row_number() over (partition by PkgPt2, PkgPt3 order by newid()) as seqnum
from DM_Main m
)
update toupdate
set PkgPt1 = (case when seqnum % 2 = 0 then 'CD2' else PkgPT1 end);