【问题标题】:Calculating the intersection of an array with a column in Postgres在 Postgres 中计算数组与列的交集
【发布时间】:2021-11-30 00:30:13
【问题描述】:
  • 我正在使用 Postgres 12.7。
  • 我有一张有几千万行的表。其中有三行 bigint[] 数组。我将它们组合成一个数组,我们称之为 bigint_array,它包含大约一到十个数字。
  • 我想将此数组与一个临时表进行比较,该表由一个包含 170k 行 bigint 值的列组成。我们称它为 reference_column。
  • 理想情况下,我想知道这个路口有多完整。交集是一次点击、多次点击还是整个数组是否以列数表示。

我读到了运算符“&”,它应该计算两个数组的交集。将 reference_column 转换为数组并使用运算符会给我错误“SQL 错误 [42883]:错误:运算符不存在:bigint[] & bigint[]”。嗯。

如果我想要一个初步结果并使用 && 运算符查看 bigint_array 和 array_agg(reference_column) 之间是否有任何重叠,它显然可以工作,但需要几个小时并且不能解决我对重叠完整性进行分类的问题。

你有什么提示吗?有没有办法计算数组与列的交集而不将其转换为数组?

我知道缺少 MWG,如有必要,我会在下班后提供一份。我花了很长时间来创建它们,因为我对 SQL 相当缺乏经验。我希望没有一个很好的提示,但如有必要会更新。对不起,谢谢。

【问题讨论】:

    标签: sql arrays postgresql


    【解决方案1】:

    根据this的回复,引用that one,可以使用CROSS JOIN LATERAL的方式如下。

    在带有reference_column 的表中,您可以将要执行拦截的数组添加为新列,并在各行中使用相同的值。

    假设:

    • 您的 bigint_array 在名为 result1 的结果中作为名为 bigint_array 的列获得
    • 您从中获取引用列的表命名为 table2,并且数据已格式化为数组:
    SELECT *
    FROM (
       SELECT
         (SELECT bigint_array FROM result1) AS array1
         , reference_column AS ref_array
         FROM table2
         ) AS O
         CROSS JOIN LATERAL 
         (
         SELECT COUNT(*) AS n_inter
         FROM 
         (
         SELECT UNNEST(array1)
         INTERSECT
         SELECT UNNEST (array2)
         ) AS U
    ) AS I
    ORDER BY n_inter DESC
    

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多