2011-07-07 5 views
1

私は2つのフィールドを持つテーブルを持っています。私はID_TASSのそれぞれのユニークな値のためのカウンタでID_ELEMを更新したいと思います。 これは正しい出力表のようになります。SQL:別のフィールドの一意の値をループするフィールドを更新します。

ID_TASS, ID_ELEM 
1  , POL_1 
1  , POL_2 
1  , POL_3 
2  , POL_1 
2  , POL_2 
3  , POL_1 
4  , POL_1 
4  , POL_2 
4  , POL_3 
4  , POL_4 

してください、任意のヘルプは大歓迎です!おかげで

答えて

1

上で動作します:

UPDATE tbl 
SET ID_ELEM = rn 
FROM 
    (SELECT ctid AS id 
     , ROW_NUMBER() OVER (PARTITION BY ID_TASS) AS rn 
    FROM tbl 
) AS tmp 
WHERE tbl.ctid = tmp.ctid 

または多分この:

UPDATE tbl 
SET ID_ELEM = ROW_NUMBER() OVER (PARTITION BY ID_TASS) 
+0

感謝ypercube !!!!!これは完璧に機能しますが、ちょっと変わっています:UPDATE test_refr set id_elem = v_test_refr.rn FROM(row_number()で区切られたid_tass)AS rn、objectid FROM test_refr)AS v_test_refr WHERE test_refr.objectid = v_test_refr.objectid; – albus2011

+0

@ albus2011:どのPostgresバージョンを使用していますか?それは 'objectid'か' oid'ですか? –

+0

Postgres 8.4 - これはシェープファイルからインポートされた空間テーブルです(この場合、私はobjectidをプライマリフィールドとして使用します) – albus2011

1

あなたがしたい場合;

ID_TASS ID_ELEM 
1  3 
1  3 
2  2 
2  2 
3  1 
4  4 
4  4 
4  4 
4  4 
1  3 

(t-sql);

update tbl 
    set ID_ELEM = (select COUNT(ID_TASS) from tbl where tbl.ID_TASS = T.ID_TASS) 
from tbl T 
+0

おかげでアレックスあなたの答えは、出力は私の投稿に表示されたものでなければなりません:ID_ELEMナンバリング一意のID_TASS値ごとに1から再起動する必要があります。 – albus2011

+0

ああ、あなたは何のデータベースを使っていますか? –

+0

+1。 – niktrs

1

非常に醜いが、私は全くそれが動作するかどうか確信しているmysqlの

SET @rank:=0; 
update t1, (select id_tass, count(*) as c 
from t1 
group by id_tass) T 
set 
    t1.t1.id_elem = case 
    when @rank >= T.c then 
    @rank:=0 
    else @rank 
    end, 
t1.id_elem = @rank:[email protected]+1 
where t1.id_tass = T.id_tass 
+0

私はPostgreSQLを使っていますが、 "SET @rank"と同等のことは分かりません。どんな助け?ありがとうございました – albus2011

関連する問題