Как выбрать половины нескольких групп в одном запросе SQL Server?

У меня есть таблица SQL Server 2008 с записями в нескольких группах, состоящих из идентификаторов составных групп (т. е. 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()
)

person David    schedule 17.09.2013    source источник


Ответы (1)


Вот идея. Перечислите строки каждой группы. Затем поместите четные (или нечетные) в контрольную группу. Вы можете сделать это в SQL Server с помощью обновляемого CTE:

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);
person Gordon Linoff    schedule 17.09.2013