【问题标题】:PostgreSQL adding two integer ArraysPostgreSQL 添加两个整数数组
【发布时间】:2021-12-26 12:46:51
【问题描述】:

我有两个 integer[] 类型的实例(由 Timescale histogram 函数生成),例如{3,5,1}{2,2,2}.
我想将这两个数组添加到 {5,7,3} 但使用

SELECT "ID", histogram(...) + histogram(...)
FROM "ID"
GROUP BY "ID"

引发以下错误:operator does not exist: integer[] + integer[]。有没有办法做到这一点?

【问题讨论】:

    标签: postgresql timescaledb


    【解决方案1】:

    我不认为有这样的功能。

    为了实现您的目标(在 SQL 中),您必须取消嵌套数组,然后添加相应的元素并将结果聚合回数组。

    SELECT 
      array_agg(
        COALESCE(h1.val, 0)+COALESCE(h2.val, 0) 
        ORDER BY COALESCE(h1.row_number, h2.row_number)
      ) as result
    FROM 
      (SELECT ROW_NUMBER() over (), val FROM unnest('{3,5,1,5}'::int[]) as val) as h1
       FULL JOIN  (SELECT ROW_NUMBER() over (), val FROM unnest('{2,2,2}'::int[]) as val) as h2 ON h1.row_number=h2.row_number
    

    我正在使用ROW_NUMBER 窗口函数来获取数组元素编号。 FULL JOIN 是必需的,因为数组的长度可能不同。这也是添加元素时需要COALESCE的原因。

    感谢@a_horse_with_no_name,查询可以使用序数重写而不依赖 row_number() 函数:

    SELECT 
      array_agg(
        COALESCE(h1.val, 0)+COALESCE(h2.val, 0) 
        ORDER BY COALESCE(h1.no, h2.no)
      ) as result
    FROM 
      unnest('{3,5,1,5}'::int[]) WITH ORDINALITY as h1(val, no)
      FULL JOIN unnest('{2,2,2}'::int[]) WITH ORDINALITY as h2(val, no) ON h1.no=h2.no
    

    【讨论】:

    • 如果要获取数组元素的索引,请使用from unnest(....) with ordinality as h1(val, idx),无需依赖row_number()。
    • 感谢您的回答,我想在连续聚合中使用它,这是时间尺度的特殊物化视图,在这些聚合中您不能使用 ORDER BY 或子条款,但很高兴知道那里大概是没有这个功能
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多