函数对SQL结果的所有第一个值求和
我有一个带有“编号”、“名称”和“结果”列的表。结果是一个2D文本数组,我需要创建一个名为“Average”的列,该列将结果数组的所有第一个值相加并除以2,请有人帮助我,我必须为此使用create函数。它看起来像这样: 表1 数 名称 结果 平均值 01 凯文 {{2.0,10},{3.0,50}} 2.5 02 马克斯 {{1.0,10},{4.0,30},{5.0,20}} 5函数对SQL结果的所有第一个值求和,sql,postgresql,function,Sql,Postgresql,Function,我有一个带有“编号”、“名称”和“结果”列的表。结果是一个2D文本数组,我需要创建一个名为“Average”的列,该列将结果数组的所有第一个值相加并除以2,请有人帮助我,我必须为此使用create函数。它看起来像这样: 表1 数 名称 结果 平均值 01 凯文 {{2.0,10},{3.0,50}} 2.5 02 马克斯 {{1.0,10},{4.0,30},{5.0,20}} 5 首先:您应该始终避免在表中存储数组(如果不是非常必要,也可以在子查询中生成它们)。将其规范化,它使几乎每一个用例中
首先:您应该始终避免在表中存储数组(如果不是非常必要,也可以在子查询中生成它们)。将其规范化,它使几乎每一个用例中的工作都变得更加轻松 第二:你应该避免更多的维度数组。这些问题很难处理。看 但是,在您的特殊情况下,您可以这样做:
unest()
将数组元素扩展为每个记录一个元素。但这并不是一级扩展:它深入扩展所有元素。为了跟踪元素,您可以使用带有有序性的添加索引
FILTER
子句可以帮助您仅聚合这些元素但是:如果这是子查询的结果,则应该考虑在数组聚合之前执行操作(如果确实需要)。这使事情变得更容易。假设:
列是主键number
列是result
或text
类型varchar
unnest((result::text[]]][1:999][1])
将返回每个子数组的第一个值(考虑到您的2D数组中最多可以有999
子数组。您可以根据需要增加或减少它)
现在,您可以根据上述查询的要求创建函数。发布表架构是一种很好的做法。此外,完全不清楚该函数将执行什么操作。@这有帮助吗?请不要忘记对每一个在任何方面有帮助的答案进行投票(指出一个好主意,展示一种方法,…)。这是对回答者在你的问题上投入的时间和精力的敬意。如果一个具体的答案完全解决了您的问题,请额外接受它以结束问题。
SELECT
number,
name,
SUM(value) FILTER (WHERE idx % 2 = 1) / 2 -- 2
FROM mytable,
unnest(avg_result) WITH ORDINALITY as elements(value, idx) -- 1
GROUP BY number, name
alter table table1 add column average decimal;
update table1 t1
set average = t2.value_
from
(
select
number,
sum(t::decimal)/2 as value_
from table1
cross join lateral unnest((result::text[][])[1:999][1]) as t
group by 1
) t2
where t1.number=t2.number