Вы можете использовать rownumber() OVER (ORDER BY random())
, чтобы назначить случайное число для каждой записи. Затем используйте его в CASE
для присвоения тега 'control'
или 'treatment'
в зависимости от того, что число меньше (или равно) половины числа строк в таблице или нет.
Для SELECT
, который выглядит следующим образом:
SELECT original_id,
duplicate_id,
CASE
WHEN rn <= (SELECT count(*) / 2
FROM elbat) THEN
'control'
ELSE
'treatment'
END tag
FROM (SELECT original_id,
duplicate_id,
row_number() OVER (ORDER BY random()) rn
FROM elbat) x;
Если вы хотите UPDATE
(я не уверен в этом), предполагая, что пара original_id
и duplicate_id
уникальна, это может выглядеть следующим образом:
UPDATE elbat t
SET tag = CASE
WHEN rn <= (SELECT count(*) / 2
FROM elbat) THEN
'control'
ELSE
'treatment'
END
FROM (SELECT original_id,
duplicate_id,
row_number() OVER (ORDER BY random()) rn
FROM elbat) x
WHERE x.original_id = t.original_id
AND x.duplicate_id = t.duplicate_id;
дб <> скрипка
(Кстати, результат SELECT
на Fiddle дает хороший пример того, что порядок возвращаемых строк может полностью отличаться от физического, если оптимизатору это нравится больше.)