postgresql - plpgsql 循环查询和更新

标签 postgresql loops sorting sql-update plpgsql

我有一个名为 test 的表,我按名为 daterange 的范围的上限对它进行排序。我想获取此排序数据的顺序并将其保存在名为 bc_order 的同一表的另一列中。

排序的顺序必须保存在bc_order列中。

所以我对我想要的数据进行排序,循环遍历结果,每次都增加一个计数器,然后用当前计数器更新 bc_order 列。

CREATE OR REPLACE FUNCTION __a_bc_order() RETURNS void  AS $$
    DECLARE
        iterator integer := 1;
        r  test%rowtype;
    BEGIN
        for r in 
        select * from test where upper(test.daterange)<0 order by upper(test.daterange) DESC
        loop     
            update test SET bc_order  = iterator where test.id = test.id ;    
            iterator := iterator + 1;
        end loop ;
    END
$$ LANGUAGE plpgsql;

select __a_bc_order();

我希望能得到类似的东西

id        daterange     bc_order
14  [-3001011,-2000101) 1
21  [-3001202,-3000102) 2
19  [-3010102,-3000102) 3
22  [-4001202,-4000102) 4
23  [-4000702,-4000302) 5
27  [-6000401,-6000201) 6
26  [-6000501,-6000301) 7

但是我明白了

id        daterange     bc_order
14  [-3001011,-2000101) 7
21  [-3001202,-3000102) 7
19  [-3010102,-3000102) 7
22  [-4001202,-4000102) 7
23  [-4000702,-4000302) 7
27  [-6000401,-6000201) 7
26  [-6000501,-6000301) 7

我想循环有一个我无法修复的问题。请指教。我使用 PostgreSQL 10

最佳答案

无需使用循环或 PL/pgSQL:

update test
  set bc_order = t.rn
from (
  select id, row_number() over (order by upper(daterange) desc) as rn
  from test
  upper(daterange) < 0 
) t
where t.id = test.id;

关于postgresql - plpgsql 循环查询和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49802591/

相关文章:

ruby-on-rails - 在 postgres heroku rails 3 应用程序上获取类名?

Python - 使用反向计数器附加行号

ios - 逻辑上确定最短路径

来自并行文件的 Python 元组

iphone - 按属性(数字)对实体进行排序,负数后等于 0

javascript - 在js中将多维json转换为数组

python - 列表列表的 Python 调度优化 [间隔调度]

sql - 如何根据入院和出院日期计算入住率

python - 减少将 POStgreSQL 表引入具有 500000 行的 Pandas 的执行时间的替代方法?

PostgreSQL 主键长度限制