PostgreSQL和pl/pgsql语法,用于根据SELECT和FUNCTION(while循环,DISTINCT COUNT)更新字段

PostgreSQL和pl/pgsql语法,用于根据SELECT和FUNCTION(while循环,DISTINCT COUNT)更新字段,postgresql,plpgsql,Postgresql,Plpgsql,我有一个大型数据库,我想做一些逻辑来更新新字段 表harvard_assignees的主键是id 逻辑是这样的 根据id 对于每个记录(WHILE),如果(状态不为NULL&&country为NULL),则更新country\u out=“US”否则更新country\u out=country 我认为步骤1是一个PostgreSQL查询,步骤2是一个函数。只是想找出最简单的方法,用精确的语法在本地实现 ==== 第二个函数更有趣,需要(我相信)DISTINCT: 查找所有不同的外键(pat_类

我有一个大型数据库,我想做一些逻辑来更新新字段

表harvard_assignees的主键是
id

逻辑是这样的

  • 根据
    id
  • 对于每个记录(WHILE),
    如果(状态不为NULL&&country为NULL),则更新country\u out=“US”否则更新country\u out=country
  • 我认为步骤1是一个PostgreSQL查询,步骤2是一个函数。只是想找出最简单的方法,用精确的语法在本地实现

    ==== 第二个函数更有趣,需要(我相信)
    DISTINCT

  • 查找所有不同的外键(pat_类型的双变量键,专利)
  • 对包含该值的记录进行计数(例如,n=3条记录具有fkey“D”、“388585”)
  • 更新这3条记录,将百分比标识为1/n(例如,更新3条记录,设置百分比=1/3)
  • 对于第一个:

    UPDATE
         harvard_assignees
    SET
        country_out = (CASE
                          WHEN (state is NOT NULL AND country is NULL) THEN 'US'
                          ELSE country
                      END);
    
    起初它有一个条件“id=…”,但我删除了它,因为我相信您实际上想要更新所有记录

    对于第二个问题:

    UPDATE           
        example_table
    SET              
        percent = (SELECT 1/cnt FROM (SELECT count(*) AS cnt FROM example_table AS x WHERE x.fn_key_1 = example_table.fn_key_1 AND x.fn_key_2 = example_table.fn_key_2) AS tmp WHERE cnt > 0)
    
    不过,那个会有点慢


    我正在考虑一种基于窗口函数的解决方案,您可能也希望了解这些功能。

    您好,谢谢您的回复。第二个正在运行(希望正确);第一个给了我一个错误,“US”是否需要创建为变量再次感谢!monte{x:错误:“我们”列不存在,我的错-这些应该是单引号。