作为更长和更复杂查询的一部分,我试图只保留一个重叠间隔的条目,以及所有不重叠的条目。这是一个最小的例子:
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 的两个范围重叠,则选择得分 == 0.75(或最长的 seq_region,因为这些属性绑定在一起)的范围
所需的输出应该是条目 #1 和 #2:
A0MZ66|280|290|0.75|RIQHQQKVKEL
A0MZ66|314|556|0.75|EEDKKELELKYQNSEEKARNLKHSVDELQKRVNQSENSVPPPPPPPPPLPPPPPNPIRSLMSMIRKRSHPSGSGAKKEKATQPETTEEVTDLKRQAVEEMMDRIKKGVHLRPVNQTARPKTKPESSKGCESAVDELKGILGTLNKSTSSRSLKSLDPENSETELERILRRRKVTAEADSSSPTGILATSESKSMPVLGSVSSVTKTALNKKTLEAEFNSPSPPTPEPGEGPRKLEGCTSSKVT
如何将其作为 SQL 查询?重叠条件可以假设一个区间总是包含在另一个区间中(开始或结束可以相同)。如果重要的话,它是一个 SQLite3 数据库。
我想我需要为此做某种自我内部连接,或者按操作分组,但我不能完全正确。非常感谢您的意见。