2012-01-13 52 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

相關問題