сравнить результат двух выборок на одной таблице - PullRequest
1 голос
/ 21 июня 2019

Предположим, у меня есть таблица mytable, как показано ниже:

sampleID   rs         A1    A2
--------------------------------
1001       rs123      A     C
1001       rs124      T     C
1001       rs125      A     T
1001       rs126      A     C
1002       rs122      A     C
1002       rs123      T     C
1002       rs124      T     C
1002       rs125      A     C

И я хотел бы сравнить любые 2 sampleID, где они имеют общее значение rs, чтобы увидеть, соответствуют ли их значения A1 и / или A2.

Например, возьмите

SELECT sampleID as Sample1, rs as rs1, A1 as A1_1, A2 as A2_1 FROM mytable where sampleID = "1001"  

SELECT sampleID as Sample2, rs as rs2, A1 as A1_2, A2 as A2_2 FROM mytable where sampleID = "1002" 

Как я могу написать инструкцию SELECT, которая берет результат каждого SELECT выше, объединяется в rs1 = rs2 и сравнивает A1_1 с A1_2 и A2_1 с A2_2

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Я бы использовал здесь самообъединение для обработки сравнений:

SELECT
    t1.sampleID,
    t2.sampleID,
    t1.rs,
    t1.A1,
    t2.A1,
    (t1.A1 = t2.A1) AS A1_comp,
    t1.A2,
    t2.A2,
    (t1.A2 = t2.A2) AS A2_comp
FROM mytable t1
INNER JOIN mytable t2
    ON t1.sampleID < t2.sampleID
WHERE
    t1.rs = t2.rs
ORDER BY
    t1.sampleID,
    t2.sampleID,
    t1.rs;

enter image description here

Демо

Условие соединения требует, чтобы sampleID на левой стороне объединения был строго меньше , чем на правой стороне.Это гарантирует, что мы не будем дублировать сравнения или сравнивать один и тот же образец с самим собой.Мы используем выбор логических равенств для значений A1 и A2, что позволяет синтаксис MySQL.Псевдонимы A1_comp и A1_comp будут 0 для несоответствия и 1 для совпадения.

0 голосов
/ 21 июня 2019

Для полноты картины я хотел бы добавить слегка измененную версию ответа, который был опубликован ранее. В этой версии только несоответствующие столбцы A1 / A2 показаны согласно предложению WHERE

SELECT 
A.rs1 as rs, A.Sample1_A1, A.Sample1_A2, B.Sample2_A1, B.Sample2_A2  
    from
    (
    SELECT sampleID as Sample1, rs as rs1, A1 as Sample1_A1, A2 as Sample1_A2 
    FROM mytable where sampleID = "1001" 
    )A left join
    ( 
    SELECT sampleID as Sample2, rs as rs2, A1 as Sample2_A1, A2 as Sample2_A2 
    FROM mytable where sampleID = "1002" 
    )B on A.rs1=B.rs2

where A.Sample1_A1 != B.Sample2_A1 or A.Sample1_A2 != B.Sample2_A2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...