使用rank()更新Postgresql表

时间:2016-03-01 13:01:55

标签: postgresql

我正在尝试使用pop_1_rank的结果更新postgresql表中的列(rank()),如下所示:

UPDATE database_final_form_merge
SET    
    pop_1_rank = r.rnk
FROM (
    SELECT pop_1, RANK() OVER ( ORDER BY pop_1 DESC) FROM database_final_form_merge WHERE territory_name != 'north'  AS rnk)r

SELECT查询本身工作正常,但我无法让它正确更新。我在这里做错了什么?

3 个答案:

答案 0 :(得分:4)

我更喜欢使用CTE表示法。

WITH cte as (
     SELECT pop_1, 
            RANK() OVER ( ORDER BY pop_1 DESC) AS rnk
     FROM database_final_form_merge 
     WHERE territory_name <> 'north'  
)
UPDATE database_final_form_merge 
SET pop_1_rank = cte.rnk
FROM cte
WHERE database_final_form_merge.pop_1 = cte.pop_1

答案 1 :(得分:0)

您在UPDATE查询中缺少WHERE,因为在执行UPDATE时...来自您基本上正在进行联接。

因此,您需要选择主键,然后匹配主键以更新仅计算排名的列。

答案 2 :(得分:0)

据我所知,Postgres更新了而不是子查询。所以,您可以join回到表格:

UPDATE database_final_form_merge
    SET    pop_1_rank = r.rnk
    FROM (SELECT pop_1, RANK() OVER ( ORDER BY pop_1 DESC) as rnk
          FROM database_final_form_merge
          WHERE territory_name <> 'north'
         ) r
    WHERE database_final_form_merge.pop_1 = r.pop_1;

另外:

  • 列别名按列名称。
  • 这假定pop_1是连接两个表的id。