2012-07-29 39 views
1

我有一個mysql「問題」,我無法環繞我的頭。mysql - 在組的子組中找到唯一的字符串匹配

我有一個數據庫中的字符串表(實際上是基因型,但不應該是相關的),可以存在於任何一個到三個樣本中。我想爲每個樣本(c_id)的每個樣本(s_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中的每個樣本找到診斷「等位基因」。

因此,對於上述以上數據的例子,我想表看起來這樣:

catalog_id SAMPLE1 SAMPLE2 SAMPLE3 ALLELECOUNT 
324   0 1  1  2 

任何想法,將不勝感激!請讓我知道如果我可以提供更多的信息,等等。

+0

也許是一個嵌套在count不同的條件語句? – jasongallant 2012-07-30 18:33:21

回答

2

你可以簡單地在COUNT(DISTINCT...添加其他列名:

COUNT(DISTINCT s_id, allele) AS ALLELECOUNT 

這將的s_idallele唯一組合計數在一起。

+0

這似乎給出了和以前相同的結果...對於c_id 4,ALLELECOUNT仍然是22.我希望每個樣本的不同計數是不同等位基因集中非共享元素的數量。 – jasongallant 2012-07-29 19:42:09

+1

@jasongallant,這是因爲你的樣本數據中有22個不同的等位基因,所以它顯示***來統計所有的行。 – 2012-07-30 09:29:31

+0

好的,我明白你在說什麼@Zane Bien,並且非常感謝你的投入。但是這並不能真正解決我正在努力解決的問題。也許另一個(更簡單的)例子會更好地說明這一點。我編輯了上面的例子來更簡單地反映這個問題! – jasongallant 2012-07-30 17:47:18

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

相關問題