2011-07-07 62 views
1

我有一個包含兩個文件的表。我想用計數器更新ID_ELEM,每個唯一值爲ID_TASS。 這應該是正確的輸出表: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(SELECT row_number()over(partition by 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 - 但這是一個從shapefile導入的空間表(在這種情況下,我使用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編號必須從1開始重新爲每個ID_TASS值設置唯一值。 – albus2011

+0

啊,你用什麼db? –

+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

相關問題