SQL:在另一个字段的唯一值上更新一个字段循环

SQL:在另一个字段的唯一值上更新一个字段循环,sql,postgresql,unique,sql-update,Sql,Postgresql,Unique,Sql Update,我有一张有两个文件的桌子。我想为ID_tas的每个唯一值更新ID_ELEM,并使用一个计数器。 这应该是正确的输出表: 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 ,

我有一张有两个文件的桌子。我想为ID_tas的每个唯一值更新ID_ELEM,并使用一个计数器。 这应该是正确的输出表:

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
请,欢迎任何帮助!如果你愿意,谢谢你

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

非常难看,但在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:=@rank+1
where t1.id_tass = T.id_tass

我完全确定它是否会起作用:

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) 

谢谢Alex的回答,但是输出必须是我的帖子中显示的:ID元素编号必须从1重新开始,每个ID元素的值都是唯一的。我使用PostgreSQL,我不知道SET@rank的等效值。有什么帮助吗?谢谢你,谢谢你!!!!!这很好地工作,但有一点变化:更新test\u refr set id\u elem=v\u test\u refr.rn,其中test\u refr.objectid=v\u test\u refr.objectid@albus2011:你使用哪个Postgres版本?是objectid还是oid?Postgres 8.4-但这是从shapefile导入的空间表在本例中,我使用objectid作为主关键字字段SQL一开始有点混乱-CTID/ID是唯一的行ID,分区by在我添加SQL server强制的order by之前不起作用。不过,这是一个很好的解决方案: