0

このような列を持つテーブルがあります。

サイト、染色体、ストランド。

サイトと染色体のペアは、複数の鎖を持つことができますが、一意でなければなりません。データをロードする前に、一部のサイトに複数の染色体があることがわかりました。これは明らかにエラーです。私は、複数の染色体を持つサイトであるエラーを特定しようとしていました。私はそれについて考えましたが、適切なSQLを思い付くことができませんでした。そこで、問題を分割しました。最初に、個別のレコードを選択するテーブルを作成します。

create table distinct_pair 
  as select distinct site, chromosome 
  from original_table;

次に、これにより複数の染色体を持つサイトを見つけることができました。

select site 
  from distinct_pair 
  group by site 
  having count(site)>1;

うまくいきました。次に、元のテーブルからエラーのすべての情報を確認しようとして、これを行いました。

select * from original_table 
  where site 
  in (select name from distinct_pair
        group by site 
        having count(site)>1);

次に、列がすべてインデックス化されていても、このサブクエリは遅すぎました。

クエリを結合として書き直そうとしましたが、持っていると難しくなります。私を助けてください。

===================

この質問に答えてくれた皆さん、ありがとう。私のデータは次のようになります。

Site | Chromosome | Strand
N111 | 2L         | +
N111 | 2L         | -
N112 | 2L         | +
N112 | 2L         | -
N112 | 3L         | +
N112 | 3L         | -
....

この場合、N111 は問題ありませんが、N112 は染色体データが 2 つあるためエラーです。2番目の回答のサブクエリは、ストランドのためにN111とN112を選択しましたが、これは私が抱えていたのと同じ問題でした。複数の列を持つ関数によるグループ化は、私が推測したものとは異なりました。ただし、提案された回答は、group by がどのように機能するかの手がかりを与えてくれたので、少し変更して機能させることができました。2 つの答えは同じ結果になります。改めまして、ありがとうございます。

サイト

4

2 に答える 2

0

次のようなものが必要なようです:

     SELECT site, chromosome, strand
       FROM original_table O
INNER JOIN (SELECT site, chromosome
            FROM original_table
            GROUP BY site, chromosome
            HAVING COUNT(*) > 1) T
         ON USING (site)
        AND USING (chromosome)

サブクエリは、複数回繰り返されるサイトと染色体のペアを選択し、それを大きなテーブルに結合します。これは INNER JOIN であるため、サブクエリで一致する行のみを返します。

于 2010-11-26T00:19:07.417 に答える
0

特定のサイトの異なる染色体を持つものを見つけることができます:

SELECT DISTINCT t1.site, t1.chromosome, t2.chromosome
FROM original_table t1
    INNER JOIN original_table t2 USING (site)
WHERE t1.chromosome <> t2.chromosome
于 2010-11-26T03:04:13.160 に答える