繁体   English   中英

计算数组与 Postgres 中列的交集

[英]Calculating the intersection of an array with a column in Postgres

  • 我正在使用 Postgres 12.7。
  • 我有一个包含几千万行的表。 其中有三行 bigint[] 数组。 我将它们组合成一个数组,我们称之为 bigint_array,它包含大约一到十个数字。
  • 我想将这个数组与一个临时表进行比较,该临时表由一列和 170k 行的 bigint 值组成。 我们称其为 reference_column。
  • 理想情况下,我想知道这个交集有多完整。 交叉点是一次命中、多次命中还是整个数组是否以列的数字表示。

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

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

你有什么提示吗? 有没有一种方法可以在不将其转换为数组的情况下计算数组与列的交集?

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

根据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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM