3

我有一个 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()
)
4

1 回答 1

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);
于 2013-09-17T19:57:39.310 回答