0

我想从表中选择具有完全相同属性的组。例如,我的表如下

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 1and2是相同的,while 3has sharedfcj_id但不等于1and 2。我想查询:

  1. fcj_id从一个特定的地方收集所有facs_run_id
  2. 找到所有facs_run_id具有完全相同的fcj_id组合。

在这里,我想找到所有与组合facs_run_id相等的,所以它应该返回(或& )。fcj_idfacs_run_id: 1212

我可以得到那些缺少的东西fcj_id,甚至可以找到fcj_id缺少的东西:

SELECT facs_run_id 
FROM   facs_panel 
EXCEPT 
SELECT fcj_id 
FROM   facs_panel 
WHERE  facs_run_id = 2;

或这个:

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);

但我无法进行返回 IDENTICAL 的查询facs_run_id。我想这可以被认为是寻找聚合重复项的一种方式,但我不知道该怎么做。任何建议或指针将不胜感激(或者如果这种类型的查询不起作用,则可以使用更好的方法来创建表)。

4

1 回答 1

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)
于 2012-04-11T12:13:23.543 回答