如何在单个SQL Server查询中选择多个组的一半?

时间:2013-09-17 19:47:52

标签: sql sql-server sql-server-2008 newid

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

1 个答案:

答案 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);