首页 > 解决方案 > 在 Postgres UPDATE 查询中循环 - 第 2 部分

问题描述

注意:这与我最近在Looping inside a Postgres UPDATE query中提出的其他问题非常相似,但并不相同。该问题提供的答案非常有效,但客户希望使用特定公式而不是随机选择来计算每个值以强制均匀分布。

(Postgres 10.10)我在my_table中有以下字段:

loval INTEGER 
hival INTEGER 
valcount INTEGER 
vals INTEGER[]

我需要将vals设置为包含valcount - 2 个整数(loval 和 hival 包含在最终数组中)的数组,每个整数计算如下,使用 n 作为从 2 到 valcount-1 运行的循环计数器:

loval + (n - 1) * ((hival - loval) / (valcount- 1))

因此对于:

loval: 3 
hival: 22 
valcount: 6

我希望将vals设置为:

{3, 7, 11, 14, 18, 22}

我知道如何使用低效的“通过光标循环”解决方案来做到这一点,但我想知道 Postgres 是否有办法进行内联循环计算或可以做到这一点的内置分布函数。

标签: postgresql

解决方案


您可以通过以下方式从链接的帖子中编辑答案:

update my_table
  set vals = array_append(array_prepend(loval,array(select (loval + (n-1) * ((hival - loval)::decimal / (valcount- 1)))::int 
             from generate_series(2, valcount-1) as n)),hival);

演示

| 爱| 希瓦尔| 计价 | 瓦尔斯 |
| ----- | ----- | -------- | --------------- |
| 3 | 22 | 6 | 3,7,11,14,18,22 |

::decimal将确保使用浮点数完成除法,以便您的第二个值是 7 而不是只有整数的 6。 array_prepend并将array_append在数组的开头和结尾添加一个元素


推荐阅读