更新满足递增数字条件的记录

时间:2012-08-10 08:28:06

标签: sql postgresql

我有一张像这样的postgres表:

Id    Name    local_site_id    local_id
1     A       2                
2     B       2
3     C       1
4     D       2
5     E       1

如何使用SQL查询将表更新为:

Id    Name    local_site_id    local_id
1     A       2                1
2     B       2                2
3     C       1                
4     D       2                3
5     E       1                

现在,对于所有记录,local_id字段为空。我想使用从1开始的递增数字更新local_id值仅适用于local_site_id=2的行是否可以使用SQL?

2 个答案:

答案 0 :(得分:4)

我相信这应该做你想做的事,让我知道:

UPDATE table_name
SET    local_id = row
FROM
(
    SELECT *, 
           ROW_NUMBER() OVER (PARTITION BY local_site_id ORDER BY name) AS row
    FROM   table_name
    WHERE  local_site_id = 2
) AS Q
WHERE Q.id = table_name.id;

答案 1 :(得分:4)

这是row_number()窗口函数的典型用例。 假设您的主表是T,此查询应该与postgresql 8.4或更新版本一起使用:

update T set local_id=s.rn 
from (select id,row_number() over(order by id) as rn from T where local_site_id=2) s
 where T.id=s.id;