Select 数组中的最后一个公共元素
Select last common element in arrays
我有 table 次这样的提交
CREATE TABLE commit (
id serial PRIMARY KEY,
parent_commit_ids INTEGER[] NOT NULL
);
给定两个提交 ID,我试图找到最新的(最远到数组末尾的)公共 parent_commit_id。
试试这个,如果它适合你,下面是使用自连接
Select t1.id, max(t2.id)
From table t1 join table t2
on t1.id < t2.id and
t1.parent_commit_ids =
t2.parent_commit_ids
Group by t1.id
这是一种使用条件聚合的方法。
select max(x.pid) last_common_id
from commits c
cross join lateral unnest(c.parent_commit_ids) with ordinality x(pid, rn)
where c.id in (1, 2)
group by x.rn
having max(x.pid) filter(where c.id = 1) = max(x.pid) filter(where c.id = 2)
order by rn desc limit 1
这假设您要比较提交 1 和提交 2。想法是取消嵌套每个数组,按元素索引分组,然后使用 having
子句过滤匹配值。然后,您可以对 select 最匹配的项进行排序。
示例数据(取自问题的评论):
id | parent_commit_ids
-: | :----------------
1 | {1,4,6,8}
2 | {1,4,5}
结果:
| last_common_id |
| -------------: |
| 4 |
旁注:commit
是一个 SQL 关键字,因此不是 table 名称的好选择;我改用 commits
。
我有 table 次这样的提交
CREATE TABLE commit (
id serial PRIMARY KEY,
parent_commit_ids INTEGER[] NOT NULL
);
给定两个提交 ID,我试图找到最新的(最远到数组末尾的)公共 parent_commit_id。
试试这个,如果它适合你,下面是使用自连接
Select t1.id, max(t2.id)
From table t1 join table t2
on t1.id < t2.id and
t1.parent_commit_ids =
t2.parent_commit_ids
Group by t1.id
这是一种使用条件聚合的方法。
select max(x.pid) last_common_id
from commits c
cross join lateral unnest(c.parent_commit_ids) with ordinality x(pid, rn)
where c.id in (1, 2)
group by x.rn
having max(x.pid) filter(where c.id = 1) = max(x.pid) filter(where c.id = 2)
order by rn desc limit 1
这假设您要比较提交 1 和提交 2。想法是取消嵌套每个数组,按元素索引分组,然后使用 having
子句过滤匹配值。然后,您可以对 select 最匹配的项进行排序。
示例数据(取自问题的评论):
id | parent_commit_ids -: | :---------------- 1 | {1,4,6,8} 2 | {1,4,5}
结果:
| last_common_id | | -------------: | | 4 |
旁注:commit
是一个 SQL 关键字,因此不是 table 名称的好选择;我改用 commits
。