我有一张像这样的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?
答案 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;