3

我有一个表,其中除了其他字段外,还包含以下字段: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更新,一半不更新。

4

3 回答 3

6
update table
set status_id = new_status_id
where
    status_id = old_status_id
    and random() < 0.5
于 2013-06-20T21:02:13.703 回答
2

此查询将为您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
于 2013-06-20T21:08:20.597 回答
0

当躺在床上想睡觉时,我想到了一个非常简单的解决方案:

update table
set status_id = new_status_id
where
        status_id = old_status_id
    and id % 2 = 0;

由于 id 实际上是 a bigserial,因此此查询将具有与 Clodoaldo 类似的效果。

于 2013-06-21T05:35:25.157 回答