我想从表中选择具有完全相同属性的组。例如,我的表格如下
facs_run_id | fcj_id
1 | 17
1 | 4
1 | 12
2 | 17
2 | 4
2 | 12
3 | 17
3 | 12
3 | 10
在此表中,每个facs_run_id
都有fcj_id
的不同组合,有些在facs_run_id
个数字之间共享,而有些则不是。例如,以上facs_run_id
1
和2
相同,而3
已共享fcj_id
,但与1
和{{1}不同}}。我想查询:
2
fcj_id
facs_run_id
组合的所有facs_run_id
。在此,我想找到fcj_id
组合中与facs_run_id
相等的所有fcj_id
,因此它应该返回facs_run_id: 1
(或2
& 1
)。
我可以找到遗漏某些2
的人,甚至找不到哪个fcj_id
:
fcj_id
或者这个:
SELECT facs_run_id
FROM facs_panel
EXCEPT
SELECT fcj_id
FROM facs_panel
WHERE facs_run_id = 2;
但我无法进行返回IDENTICAL SELECT row(fp.*, fcj.fcj_antigen, fcj.fcj_color)
FROM facs_panel fp
LEFT OUTER JOIN facs_conjugate_lookup fcj ON fcj.fcj_id = fp.fcj_id
WHERE fp.fcj_id in ( SELECT fp.fcj_id
FROM facs_panel fp
WHERE fp.facs_run_id = 1);
的查询。我想这可以被认为是一种寻找聚合重复的方式,但我不知道该怎么做。任何建议或指针将非常感激(或者如果这种类型的查询不起作用,则创建表的更好方法)。
答案 0 :(得分:0)
使用几个CTE非常容易:
with f1 as (select
facs_run_id,
array_agg(fcj_id) as flist
from facs_panel
group by facs_run_id),
f2 as (select flist, count(*)
from f1
group by flist
having count(*) > 1)
select f2.flist, f1. facs_run_id
from f2
join f1 on (f2.flist = f1.flist)
order by flist, facs_run_id;
通过此查询运行的问题数据会产生:
flist | facs_run_id
-----------+-------------
{4,12,17} | 1
{4,12,17} | 2
(2 rows)