sql - 重新编号重复项,使它们独一无二

标签 sql postgresql postgresql-8.2

       Table "public.t"
 Column |  Type   | Modifiers
--------+---------+-----------
 code   | text    |
 grid   | integer |

codigo 列虽然是文本类型,但有一个数字序列 重复。网格列是一个唯一的序列。

select * from t order by grid;
 code | grid
------+------
 1    |    1
 1    |    2
 1    |    3
 2    |    4
 2    |    5
 2    |    6
 3    |    7

目标是消除 code 列中的重复项,使其唯一。结果应该类似于:

 code | grid
------+------
 1    |    1
 6    |    2
 4    |    3
 2    |    4
 7    |    5
 5    |    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);

最佳答案

这是有效的解决方案。

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

它的问题是必须重复执行 update 命令,直到不再有重复项为止。这只是一个“它并不完美”的问题,因为它只是一次性操作。

关于sql - 重新编号重复项,使它们独一无二,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13137699/

相关文章:

Facebook样式墙的mysql查询

sql - 如何在 django 中将锦标赛数据库建模为 SQL

mysql - 如何通过一个 SQL 查询获取每个外键 ID 的最新数据集?

php - 使用带有 ftp 服务器的 postgresql 的复制功能

sql - postgresql:不允许负子字符串长度,但数据中没有明显的违规

xml - 在无法接受集合的上下文中调用的 Postgresql 合并和集值函数

sql - 将标签数组传递给 plpgsql 函数并在 WHERE 条件下使用它

postgresql - 按日期的动态表名称

PostgreSQL 8.2——如何获得任何数组的字符串表示?