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 最匹配的项进行排序。

Demo on DB Fiddle

示例数据(取自问题的评论):

id | parent_commit_ids
-: | :----------------
 1 | {1,4,6,8}        
 2 | {1,4,5}          

结果:

| last_common_id |
| -------------: |
|              4 |

旁注:commit 是一个 SQL 关键字,因此不是 table 名称的好选择;我改用 commits