我有一个表,其中除了其他字段外,还包含以下字段:id integer, status_id integer, add_date date
.
我想执行一个类似这样的查询:
update table set status_id = new_status_id where status_id = old_status_id
但它只会更新给定百分比的值,比如 50%。此外,每个日期的更新行的分布应该是相似的;我想要半行date = 23.06.2013
更新,一半不更新。
我有一个表,其中除了其他字段外,还包含以下字段:id integer, status_id integer, add_date date
.
我想执行一个类似这样的查询:
update table set status_id = new_status_id where status_id = old_status_id
但它只会更新给定百分比的值,比如 50%。此外,每个日期的更新行的分布应该是相似的;我想要半行date = 23.06.2013
更新,一半不更新。
update table
set status_id = new_status_id
where
status_id = old_status_id
and random() < 0.5
此查询将为您id
提供要更新的行:
SELECT *
FROM
(SELECT id,
count(id) OVER (PARTITION BY add_date) cnt,
row_num() OVER (PARTITION BY add_date ORDER BY id) rn
FROM table
WHERE status_id = old_status_id) sub
WHERE rn <= cnt * 0.5 -- your percentage
-- WHERE rn <= cnt * 0.5 + random() -- another (better) version.
-- Will update at random if there if only one row
当躺在床上想睡觉时,我想到了一个非常简单的解决方案:
update table
set status_id = new_status_id
where
status_id = old_status_id
and id % 2 = 0;
由于 id 实际上是 a bigserial
,因此此查询将具有与 Clodoaldo 类似的效果。