mysql - 在组的子组中查找唯一的字符串匹配

时间:2012-07-29 16:46:25

标签: mysql

我有一个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

任何想法都将不胜感激!如果我能提供更多信息等,请告诉我。

2 个答案:

答案 0 :(得分:2)

您只需在COUNT(DISTINCT...

中添加其他列名称即可
COUNT(DISTINCT s_id, allele) AS ALLELECOUNT

这将统计s_idallele的唯一组合。

答案 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>