У меня проблема с построением запроса ...
У меня есть одна таблица, которая содержит строки: имя, начало, конец, ссылка, alt, PatientNo.
Пример данных выглядит так:
chr1, 10, 10, A, B, 9999;
chr1, 12, 12, B, A, 9999;
chr1, 18, 18, A, B, 9999;
chr1, 29, 29, C, B, 9999;
chr1, 10, 10, A, A, 8888;
chr1, 12, 12, A, B, 8888;
chr2, 18, 18, D, C, 8888;
chr2, 29, 29, A, B, 8888;
конец так далее ...
Мне нужно создать запрос, который сравнивает пациентов друг с другом.
т.е .:
if (chr1, начало, конец, альтернатива пациента 9999) = (chr1, начало, конец, альтернатива пациента 8888)
вернуть строку ...
есть идеи как сделать такой запрос?
спасибо
Edit:
ОК, у меня все еще есть проблема.
У меня есть десять CSV-файлов с геномными данными пациентов.
Каждый файл содержит около 70000 строк.
Я помещаю данные из файлов CSV в базу данных MySQL (поэтому моя база данных содержит одну таблицу с 700000 строками).
Теперь мне нужно отфильтровать эти данные. Есть много столбцов, например:
имя (varchar), начало (int), end (int), ref (varchar), alt (varchar), пациент № 1027 * (varchar).
Пример заявления: SELECT name, start, end, ref, alt, patientNo FROM mytable
; возвращает следующие данные:
chr1, 10, 10, A, C, 9999;
chr1, 12, 12, T, T, 9999;
chr2, 18, 18, A, T, 9999;
chr2, 29, 29, C, C, 9999;
chr3, 10, 10, A, G, 9999;
chr3, 12, 12, A, C, 9999;
chr1, 18, 18, G, C, 8888;
chr2, 29, 29, A, G, 8888;
chr2, 10, 10, A, G, 8888;
chr3, 12, 12, G, A, 8888;
chr1, 18, 18, A, G, 666z;
chr2, 29, 29, C, G, 666z;
chr3, 10, 10, A, A, 666z;
chr4, 12, 12, A, G, 666z;
chr5, 18, 18, T, C, 666z;
chr1, 29, 29, A, G, 44a4;
chr1, 10, 10, A, G, 44a4;
chr2, 12, 12, G, A, 44a4;
chr2, 18, 18, A, G, 44a4;
chr1, 29, 29, C, G, 3333;
chr1, 10, 10, A, A, 3333;
chr1, 12, 12, A, G, 3333;
chr1, 18, 18, T, C, 3333;
chr2, 29, 29, A, G, 3333;
Мне нужно извлечь строки, которые имеют уникальную букву в столбце alt , с указанием name и start position, alt письмо, которое является уникальным для пациента.
Если я присоединюсь к столбцам
SELECT p1.name, p1.start, p1.alt, p2.alt, p3.alt, p4.alt, p5.alt
FROM mytable p1, mytable p2, mytable p3, mytable p4, mytable p5
WHERE ( p1.patientNo = "9999" and p2.patientNo = "8888" and
p3.patientNo = "666z" and p4.patientNo = "44a4" and
p5.patientNo = "3333") ;
Я получаю результаты, например ::1010 *
chr1 10 A A A A A
chr1 13 G G G G G
chr2 17 A A G A A
chr2 19 A A G G A
chr3 38 A C A T T
так что значит:
- В начале позиции = 10 каждый пациент p1, p2, p3, p4, p5 получил букву A. Это хорошо, что мы пропустили этот ряд
- То же самое с начальным положением 13.
- В позиции start = 17 пациент p3 получил уникальную букву G, поэтому мы
поместите эту строку в таблицу результатов
- В следующем ряду (19) нет уникальной буквы, мы ее пропускаем.
- В строке (38) буква «С» является уникальной буквой, поэтому мы помещаем пациента p2 в
таблица результатов.
Итак, результат приведенного выше примера должен выглядеть следующим образом:
chr2, 17, G, 666z
chr3, 19, C, 8888
Можно ли построить запрос, который будет возвращать такой результат из исходной таблицы?