函数对SQL结果的所有第一个值求和

函数对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 首先:您应该始终避免在表中存储数组(如果不是非常必要,也可以在子查询中生成它们)。将其规范化,它使几乎每一个用例中

我有一个带有“编号”、“名称”和“结果”列的表。结果是一个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