Sql 对重复项重新编号以使其唯一

Sql 对重复项重新编号以使其唯一,sql,postgresql,postgresql-8.2,Sql,Postgresql,Postgresql 8.2,codigo列虽然是文本类型,但其数字序列 复制品。网格列是唯一的序列 Table "public.t" Column | Type | Modifiers --------+---------+----------- code | text | grid | integer | 目标是消除code列中的重复项,使其唯一。结果应类似于: select * from t order by grid; code | grid ------+------

codigo
列虽然是文本类型,但其数字序列 复制品。网格列是唯一的序列

       Table "public.t"
 Column |  Type   | Modifiers
--------+---------+-----------
 code   | text    |
 grid   | integer |
目标是消除
code
列中的重复项,使其唯一。结果应类似于:

select * from t order by grid;
 code | grid
------+------
 1    |    1
 1    |    2
 1    |    3
 2    |    4
 2    |    5
 2    |    6
 3    |    7
版本为8.2(无窗口功能)


这就是有效的解决方案

create table t (code text, grid integer);
insert into t values
 ('1',1),
 ('1',2),
 ('1',3),
 ('2',4),
 ('2',6),
 ('3',7),
 ('2',5);
问题是必须重复
update
命令,直到不再重复。这只是一个“它不是完美的”问题,因为它只是一个一次性操作。

导出(并删除)除
code
列以外的所有内容(也许您可以子查询导出,并删除重复的行)。使
code
primary具有自动递增行为并重新导入所有内容<代码>代码列应自动生成

create table t (code text, grid integer);
insert into t values
 ('1',1),
 ('1',2),
 ('1',3),
 ('2',4),
 ('2',6),
 ('3',7),
 ('2',5);
drop sequence if exists s;
create temporary sequence s;
select setval('s', (select max(cast(code as integer)) m from t));

update t
set code = i
from (
    select code, grid, nextval('s') i
    from (
        select code, max(grid) grid
        from t
        group by code
        having count(*) > 1
        order by grid
    ) q
) s
where
    t.code = s.code
    and
    t.grid = s.grid