2011-07-07 41 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

相关问题