2016-09-27 4 views
3

Я пытаюсь рассчитать частоту моих элементов в каждой строке, я объясню: Я выбираю из таблицы, содержащей некоторые элементы, такие как «pos, chr, ref, alt, id_disease» ,Вычислить частоту для каждой строки

Из них я буду извлекать частоту моей реф, альт что:

num_occurrencies_of(ref='A' and alt='C')/total number of rows.

С помощью этого запроса я получаю едва близко к моей цели, на самом деле идентификатор не рассчитать правильно частоту он всегда возвращает a constant

SELECT pos, chr, upper(ref||' '||alt) AS refalt, id_disease AS lvl15, t1.tot_var, t1.freq 
FROM varianti 
JOIN (SELECT count(*) AS tot_var,(count(*)::numeric/sum(count(*)) over()) as freq 
     FROM varianti)t1 ON TRUE 
WHERE length(ref)=1 AND length(alt)=1 AND chr similar to 'chr[\d X Y]*' 

Все, что я хочу, чтобы получить данные, как это:

chr pos refalt lvl15 freq tot_var 
1 120 AT  15 0.3 1000 
1 150 CG  30 0.01 1000 

tot_var = подсчитывает общее количество моих строк, в которых я нуждаюсь (не может быть 1, я подсчитываю каждую строку!)

Оба ref и alt могут иметь эти значения (A, T, C, G) в каждой возможной перестановке, AA, AT, TA, TC, CT и т. Д.

Что мне не хватает в моем коде?

Скажите мне, если вы хотите дальнейшие Infos


Пример из varianti:

chr pos ref alt id_disease 
chr1 152 A C 15 
chr3 487 T T 74 

здесь выход моего запроса:

pos   chr refalt lvl15 tot_var freq 
124338543 chr11 G A  69  1  0.000000677833751782702767 
124338595 chr11 C T  28  1  0.000000677833751782702767 
124361862 chr11 C .  53  1  0.000000677833751782702767 
124361899 chr11 T A  20  1  0.000000677833751782702767 
+2

Можете ли вы привести несколько строк таблицы 'varianti'? thks – maximilienAndile

+0

Здесь вы идете, обновите пример. – xCloudx8

ответ

1

На основании предоставленной вами информации

SELECT DISTINCT chr, pos, 
upper(ref||' '||alt) AS refalt, id_disease AS lvl15, 
SUM(CASE WHEN (ref == 'A' AND alt == 'C')THEN 1 ELSE 0 END)/COUNT(*) AS 'freq', 
COUNT(*) AS 'tot_var' 
FROM varianti 

Я все еще не уверен, что такое «tot_var». Было бы полезно получить фактический образец данных и ожидаемый результат этого самого образца данных.

Edit 1: Для того, чтобы получить частоту каждой пары в наборе данных

SELECT DISTINCT upper(ref||' '||alt) AS refalt, 
COUNT(chr)/COUNT(*) AS 'freq' 
FROM varianti 
GROUP BY refalt 

Edit 2: Обновленный запрос на основе требований

SELECT varianti.chr, varianti.pos, 
upper(varianti.ref||' '||varianti.alt) AS refalt, varianti.id_disease AS lvl15, COUNT(*) AS 'tot_var', 
FROM varianti 
JOIN 
(SELECT DISTINCT upper(ref||' '||alt) AS refalt, 
    COUNT(chr)/COUNT(*) AS 'freq' 
    FROM varianti 
    GROUP BY refalt 
) refalt_table ON refalt_table.refalt = varianti.refalt 

Edit 3: Обновленный запрос основан на ошибке

SELECT chr, pos, upper(ref||' '||alt) as refalt, id_disease AS lvl15, refalt_table.freq as 'freq', (SELECT COUNT(*) FROM varianti tot where tot.pos = v.pos) as 'tot_var' 
FROM varianti v 
LEFT JOIN 
(SELECT DISTINCT UPPER(ref) as 'ref',UPPER(alt) as 'alt', 
    COUNT(pos)/(SELECT COUNT(*) FROM varianti vcount) AS 'freq' 
    FROM varianti 
    GROUP BY ref,alt 
) refalt_table ON refalt_table.ref = v.ref and refalt_table.alt = v.alt 
+0

Ух, это нормально, но как я могу получить частоту для каждой пары? – xCloudx8

+0

Да, я не понимаю, как запрашивается образец входных данных, кроме запроса SQL, который вы указали. Было бы здорово, если бы мы могли получить образец ввода и вывод образца данных запроса. – woodhead92

+1

@ xCloudx8 Я отредактировал решение, чтобы получить частоту. – woodhead92

Смежные вопросы