2012-01-13 5 views
0

テーブルから完全に同じ属性を持つグループを選択したいと思います。他のものはありませんしながら、例えば、私の表は、各facs_run_idfcj_idの異なる組み合わせを有し、このテーブルの次テーブル内の同一の組み合わせのサブクエリ

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数字間で共有されます。例えば、facs_run_id12は同一であり、3fcj_idを共有していますが、12とは同一ではありません。

  1. はまったく同じfcj_id組み合わせを持つすべてのfacs_run_idを見つける特定のfacs_run_id
  2. からすべてのfcj_idを収集します。私はにクエリを作成したいと思います。

ここでは、私はfacs_run_id: 1からfcj_idの組み合わせが同じであるすべてのfacs_run_idを見つけたいので、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); 

しかし、私はそのクエリを作成することはできませんよIDを返します。これは集計された重複を探す方法と考えることができると思いますが、どうやってそれを行うのか分かりません。任意の提案やポインタは非常に(またはこのタイプのクエリが動作しない場合は、テーブルを作成するための良い方法)をいただければ幸いです。

答えて

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

はどうもありがとうございました!私は今あなたの答えを見つけましたが、私はこれをすべてやり直す準備ができています。ありがとうございました。 – user1148636

関連する問題