postgresql - 在 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 是否有办法进行内联循环计算或可以做到这一点的内置分布函数。
解决方案
您可以通过以下方式从链接的帖子中编辑答案:
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
在数组的开头和结尾添加一个元素
推荐阅读
- hyperledger-fabric - 网关编程模型是新常态吗?
- python - 我想设置密码来关闭discord.py上的机器人,但我不知道如何编写代码。有人帮我写代码
- lua - 如何制作没有其他依赖项的 LÖVE2d 可执行文件或安装程序文件?
- r - 在 R 中的函数中传递参数
- mysql - MySQL 查询返回在一个订单中购买超过 2 件商品的所有客户的姓名
- shopware - 从非 Shopware 插件类扩展店面 JavaScript 类
- bash - 执行 bash 变量(包含另一个变量)作为命令并将结果分配给变量
- macos - 为什么 PS Remote 播放 Apple Script 代码只偶尔有效
- java - 正则表达式匹配某个模式和介于两者之间的某个数量的值
- reactjs - 无法在 useEffect 挂钩内设置状态