我有一个包含6M +行的数据集,包括从2003年到当前的时间戳。 2014年,数据库迁移到postgresql,由于时间戳的精度更高,时间戳列变得独一无二。原始ID列未迁移。大约300k的时间戳至少重复一次。我想修改timestamp列,使它们通过添加精度是唯一的(所有非唯一时间戳只到第二个)。
我有这个
ts message
--------------------|---------------
2014-02-01 07:40:37 | message1
2014-02-01 07:40:37 | message2
我想要这个
ts message
-------------------------|---------------
2014-02-01 07:40:37.0000 | message1
2014-02-01 07:40:37.0001 | message2
答案 0 :(得分:0)
这应该可行,但我想这会非常慢:
update the_table
set ts = ts + '1 millisecond'::interval * x.rn
from (
select ctid, row_number() over (order by ts) as rn
from the_table
) x
where the_table.ctid = x.ctid;
列ctid
是Postgres维护的internal unique identifier(实际上是行的物理地址)。
您可能希望添加另一个where
条件,以仅选择需要修改的行。
答案 1 :(得分:0)
一个简单的解决方案是尝试在时间戳中添加随机区间:
update t
set ts = ts + random() * interval '1000000 microsecond'
where ts = date_trunc('second', ts)
碰撞的可能性非常低。如果发生,请使用@a_horse's answer