2012-01-13 49 views
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_id12是相同的,而3共享fcj_id但与12不相同。我想提出查询:

  1. 收集所有fcj_id从特定facs_run_id
  2. 发现具有完全相同的fcj_id组合的所有facs_run_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; 

或本:

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。我想这可能被认为是一种寻找聚合重复的方式,但我不知道该怎么做。任何建议或指针将不胜感激(或更好的方式来创建表,如果这种类型的查询将无法正常工作)。

回答

0

这是很容易与一对夫妇的热膨胀系数:

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) 
+0

非常感谢您!我现在刚刚找到了答案,但我准备好重做所有这些。谢谢。 – user1148636 2014-09-25 18:37:46

相关问题