1
       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);
4

2 に答える 2

0

これはうまくいった解決策です。

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重複がなくなるまでコマンドを繰り返さなければならないことです。1回限りの操作なので、「完璧ではない」という問題です。

于 2012-10-30T11:08:41.583 に答える
0

列以外のすべてをエクスポート (および削除) しcodeます (おそらく、エクスポートのためにサブクエリを実行し、重複した行だけを削除できます)。自動インクリメントcode動作などでプライマリを作成し、すべてを再インポートします。code列が自動的に生成されます。

于 2012-10-30T13:54:38.713 に答える