はるかに長く複雑なクエリの一部として、重複する間隔のエントリを 1 つだけ保持し、重複しないすべてのエントリを保持しようとしています。最小限の例を次に示します。
create table protein (
seqid varchar(100),
start SMALLINT(5),
`end` SMALLINT(5),
cutoff FLOAT(5,4),
seq_region TEXT
);
insert into protein (seqid, start, `end`, cutoff, seq_region) values ("A0MZ66", 280, 290, 0.75, "RIQHQQKVKEL");
insert into protein (seqid, start, `end`, cutoff, seq_region) values ("A0MZ66", 314, 556, 0.75, "EEDKKELELKYQNSEEKARNLKHSVDELQKRVNQSENSVPPPPPPPPPLPPPPPNPIRSLMSMIRKRSHPSGSGAKKEKATQPETTEEVTDLKRQAVEEMMDRIKKGVHLRPVNQTARPKTKPESSKGCESAVDELKGILGTLNKSTSSRSLKSLDPENSETELERILRRRKVTAEADSSSPTGILATSESKSMPVLGSVSSVTKTALNKKTLEAEFNSPSPPTPEPGEGPRKLEGCTSSKVT");
insert into protein (seqid, start, `end`, cutoff, seq_region) values ("A0MZ66", 356, 406, 1.0, "PPPPPPLPPPPPNPIRSLMSMIRKRSHPSGSGAKKEKATQPETTEEVTDLK");
SELECT * from protein;
A0MZ66|280|290|0.75|CCCCCC
A0MZ66|314|556|0.75|ABCDEFG
A0MZ66|356|406|1.0|ABCD
エントリ 2 と 3 は同じ id で範囲が重複しています (一方の開始と終了は他方に含まれています) が、 と は異なりcutoff
ますseq_region
。エントリ #3 は、実際にはエントリ #2 の部分文字列です。私がSQLに入れることができないのは条件です:
- 同じ seqid の 2 つの範囲が重複する場合は、スコア == 0.75 (または、これらの属性が結合されているため、最長の seq_region) を持つ範囲を選択します。
目的の出力は、エントリ #1 と #2 である必要があります。
A0MZ66|280|290|0.75|RIQHQQKVKEL
A0MZ66|314|556|0.75|EEDKKELELKYQNSEEKARNLKHSVDELQKRVNQSENSVPPPPPPPPPLPPPPPNPIRSLMSMIRKRSHPSGSGAKKEKATQPETTEEVTDLKRQAVEEMMDRIKKGVHLRPVNQTARPKTKPESSKGCESAVDELKGILGTLNKSTSSRSLKSLDPENSETELERILRRRKVTAEADSSSPTGILATSESKSMPVLGSVSSVTKTALNKKTLEAEFNSPSPPTPEPGEGPRKLEGCTSSKVT
これをSQLクエリとしてどのように配置するのですか? オーバーラップ条件では、一方の間隔が常に他方の間隔に含まれていると想定できます (開始または終了は同じである可能性があります)。問題があれば、それは SQLite3 データベースです。
これにはある種の自己内部結合、または操作によるグループ化を行う必要があると思いますが、うまくいきません。ご意見をお待ちしております。