我有一个mysql“问题”,我无法绕过头。
我有一个来自数据库的字符串表(实际上是基因型,但不应该是相关的),可以存在于任何一到三个样本中。我想计算每个样本(c_id)的每个样本(c_id)的唯一等位基因数。例如,如下表所示:
id batch_id catalog_id sample_id tag_id allele depth
309 1 324 1 323 TCGC 244
1449616 1 324 2 7961 TCGC 192
2738325 1 324 2 1168472 CCGG 31
3521555 1 324 3 221716 TAAC 29
到目前为止,我已经能够构建以下代码:
CREATE TABLE danumbers2
SELECT catalog_id,
count(case when sample_id = '1' and allele != 'consensus' then sample_id end) as SAMPLE1,
count(case when sample_id = '2' and allele != 'consensus' then sample_id end) as SAMPLE2,
count(case when sample_id = '3' and allele != 'consensus' then sample_id end) as SAMPLE3,
sum(case when sample_id = '1' and allele != 'consensus' then depth end) as DEPTH1,
sum(case when sample_id = '2' and allele != 'consensus' then depth end) as DEPTH2,
sum(case when sample_id = '3' and allele != 'consensus' then depth end) as DEPTH3,
count(distinct allele) AS ALLELECOUNT
from matches as danumbers
group by catalog_id
CREATE TABLE thehitlist_all
SELECT catalog_id,SAMPLE1,SAMPLE2,SAMPLE3,DEPTH1,DEPTH2,DEPTH3,ALLELECOUNT
FROM danumbers
WHERE(SAMPLE1>1 SAMPLE2>1 AND SAMPLE3>1 AND ALLELECOUNT>1 AND DEPTH2>10 AND DEPTH3>10)
这给出了这个结果:
catalog_id SAMPLE1 SAMPLE2 SAMPLE3 DEPTH1 DEPTH2 DEPTH3 ALLELECOUNT
324 1 2 1 244 223 29 4
结果基本上是每个样本中等位基因总数的catalog_id排序计数,其中每个目录ID 的总不同等位基因数。我对计算感兴趣(但似乎无法弄清楚!)是样本之间不共享的“独特”等位基因。换句话说,在每个目录id中找到每个样本的诊断“等位基因”。
因此,对于上面的上述示例数据,我希望该表看起来像这样:
catalog_id SAMPLE1 SAMPLE2 SAMPLE3 ALLELECOUNT
324 0 1 1 2
任何想法都将不胜感激!如果我能提供更多信息等,请告诉我。
答案 0 :(得分:2)
您只需在COUNT(DISTINCT...
:
COUNT(DISTINCT s_id, allele) AS ALLELECOUNT
这将统计s_id
和allele
的唯一组合。
答案 1 :(得分:0)
这将为您提供其等位基因在catalog_id中诊断的匹配的完整记录:
select good.*
from matches good
left join matches dq on
dq.catalog_id = good.catalog_id and
dq.allele = good.allele and
dq.sample_id != good.sample_id
where dq.catalog_id is null
从这里开始,您应该可以转储到临时表,并使用类似于您已经说明的技术轻松汇总。如果您愿意,您可以跳过临时表并直接进行汇总。
它只筛选出每个目录中多个样本的等位基因所在的行。如果在同一目录中找到相同样本的相同等位基因,则仍会为其返回一行。如果你想选择那些仅为每个目录中的一个RECORD找到等位基因的那个(而不是每个目录一个样本),那么你可以将dq.sample_id!= good.sample_id更改为dq.id!= good.id < / p>