2017-05-28 9 views
2

私は生物学的な「特定の生物群のコアゲノムを見つける」問題を見つけようとしています。基本的に、生物のリストがあれば、それらに共通するすべての遺伝子を見つける。離れて生物学を抽象化するために、人のリストの中で好きな色を見つけることができます(1人は複数の好きな色を持つことができます)。テーブルにn回自己結合する

データベースのテーブルには、次のようになります。出すために[ジョン、ジェイソン]のような名前のセットを指定することができます

name | fav_colour 
john | red 
john | blue 
john | green 
jason | red 
jason | blue 
matt | red 
matt | teal 

ユーザー[赤、青]、または[ジョン]を取得する[赤、青、緑]、[ジョン、ジェイソン、マット]を押し​​て[赤]を取得します。 nが指定する名前の数である

私は自己のn個の数をすることによってこの問題を解決しようとしているが加わります。

私が指定する名前の任意の数のこの問題を解決するための表の結合、自己のn個の数を行うための方法はありますか?私はPostgres関数でこれを行う方法を探してみましたが、n個の自己結合部分を理解することはできません...正しい方向への助けや指針があれば幸いです。

そして、いや、残念ながら私は簡単にクエリのこれらの種類を行うには、スキーマを変更することはできません。

+1

参加アプローチは、グループを使用して、それぞれの遺伝子を持っている(*)カウントどのように多くの生物カウントし、その後の持つ数=数を使用して、この上の私の最初の考えは使用集計のいずれかにある....私に話すものではありません生物。心に浮かぶもう一つのアイデアは、各生物のためのクエリを一緒にストリングし、共通要素を得るためにINTERSECTを使用することです。 – joshp

+0

*正確にどのようにユーザーが "名前のセットを指定する"のですか?名前が1列のテーブルにあると仮定できますか? – philipxy

+0

@philipxy私は、解析されてカウントされる値の配列を受け入れるストアドプロシージャが必要でした。配列内の項目の数はnになります。これは必要な自己結合の数になります。 – player87

答えて

3

私はあなたがこれに自己結合を必要としないと思います。あなたは集約とHAVING句を使用することができます。

with t(name, fav_colour) as (
     values ('john', 'red'), 
      ('john', 'blue'), 
      ('john', 'green'), 
      ('jason', 'red'), 
      ('jason', 'blue'), 
      ('matt', 'red'), 
      ('matt', 'teal') 
    ) 
select fav_colour 
from t 
where name in ('john', 'jason') 
group by fav_colour 
having count(*) = 2; 

値「2」は、リスト内の名前の数です。 INリストとカウントを変更するだけで必要な変更です。

+0

他の列もある場合、これはどのように機能しますか?例えば、fav_colourカラムの値に基づいて好きな色を見つけますが、年齢(John、Jasonの例では2つの異なる年齢)を返します(特定の人物の年齢を返すことができれば、定義された種)。私のデータでは、一般的な遺伝子は説明列に基づいていますが、異なる種の遺伝子には別のIDがあり、それ以降の照会に使用することができます。 – player87

+2

@ player87 。 。別の質問がある場合は、*別の質問としてそれを聞いてください。この質問は具体的には2つの列であり、質問を変更するとこの答えが無効になり、下線が引き付けられる可能性があります。しかし、マッチした行からの年月を欲しければ、 'array_agg()'を使うことができます。 –

+0

実際には、array_agg()は私がやりたいことに対して機能します。ただし、元の質問に従うだけで、特定の条件でn回自己結合することは可能ですか(つまり、名前の列はn個の表で一意です)。 – player87

関連する問題