我想在PostgresSQL中比较并获得两个数组之间的对应位置数.

例如: 给出这张桌子

id array
1 a, b, d
2 a, e
3 a, b, d, e
4 b, c, d

我想要一个对比表:

id_1 id_2 number_of_matches
1 2 1
1 3 3
1 4 2
2 3 2
2 4 0
3 4 2

每个数组中没有重复的值,数组中项的顺序并不重要.

我发现重叠运算符(&&)有here个,但它只在两个数组之间是否存在对应关系时返回布尔值,而不是返回对应关系的数量.

CREATE TABLE data (id integer, val text[]);
INSERT INTO data VALUES (1, '{a,b,d}');
INSERT INTO data VALUES (2, '{a,e}');
INSERT INTO data VALUES (3, '{a,b,d,e}');
INSERT INTO data VALUES (4, '{b,c,d}');
SELECT a.id id_1, b.id id_2, a.val && b.val match 
FROM data a, data b
WHERE a.id < b.id;

退货

id_1 id_2 match
1 2 t
1 3 t
1 4 t
2 3 t
2 4 f
3 4 t

推荐答案

demo:db<>fiddle

WITH normalized AS (                      -- 2
    SELECT
        id,
        unnest(val) as array_element      -- 1
    FROM data
)
SELECT
    n1.id,
    n2.id,
    COUNT(*)
FROM normalized n1
JOIN normalized n2                        -- 3
    ON (n1.array_element = n2.array_element AND n1.id <> n2.id)
GROUP BY n1.id, n2.id                     -- 4
ORDER BY n1.id, n2.id
  1. 规格化您的数据(注意:您应该考虑直接在表中规格化您的数据;意思是:没有数组), for each 数组元素创建一行
  2. 使用CTE来"存储"您的标准化结果
  3. self 加入你的标准化结果(但不是相同的id)在array_element
  4. GROUPCOUNT

Postgresql相关问答推荐

我无法在过程中提交

我可以将jsonb_set与来自SELECT语句的新值(第三个参数)一起使用吗?

PostgreSQL 不删除旧的 WAL 档案

Postgres >= 和 <= 具有特殊字符的行为

在 postgresql 中查找表的所有依赖项

在 Postgres 中查询 JSON 对象数组

heroku、postgreSQL、django、comments、tastepie:没有运算符匹配给定的名称和参数类型

如何在 Postgres 中的列上删除唯一约束?

等效于 Postgresql 中的 FOUND_ROWS() 函数

?(问号)运算符在 Rails 中查询 Postgresql JSONB 类型

返回 NULL 的空数组的 array_length()

Rails 4 迁移: has_and_belongs_to_many table name

在不存在的行上有select for update块

Postgres 日期重叠约束

将属性添加到 Sequelize FindOne 返回的对象

Django:按月查询组

有没有办法确保 WHERE 子句在 DISTINCT 之后发生?

PostgreSQL 9 在 Windows 上安装:Unable to write inside TEMP environment path.

实时监控 PostgreSQL 查询的应用程序?

Heroku 上的 Postgres 并将单个表转储到转储文件