Я хотел бы получить строки из этого набора данных, где существует значение T1/T3, но для соответствующего идентификатора нет значения T2/T3.
ID sample1 sample2 value
A_000002 T2 T3 -0.934119
A_000002 T1 T3 -0.866637
A_000029 T2 T3 -1.07677
A_000037 T2 T3 -0.76506
A_000057 T1 T3 -5.34988
Я хотел бы сказать что-то вроде:
SELECT * FROM table
WHERE DISTINCT ID
AND sample_1 == "T1"
AND sample_2 == "T3"
... и возвращать только следующее, потому что у него нет соответствующей строки T2/T3 для этого ID:
A_000057 T1 T3 -5.34988
Если я использую условия sample_1 и sample_2, я получаю разные значения, потому что он отфильтровывает значения "T2" перед проверкой того, является ли идентификатор отличным.
Самое близкое, что я пришел, состоит в том, чтобы сделать 3 таблицы с возможными комбинациями T1/T2/T3 и экраном для NOT EXISTS T1T2.ID = T2T3.ID
select * from T1T2
where not exists (select * from T2T3 where T2T3.id = T1T2.id)
and not exists (select * from T1T3 where T1T3._id = T1T2.id)
order by id
Хотя я не уверен, что доверяю коду.
Вы можете использовать его not exists
:
select t.*
from table t
where (sample1 = 'T1' and sample2 = 'T3') and
not exists (select 1
from table t1
where t1.id = t.id and
t1.sample1 = 'T2' and t1.sample2 = 'T3'
);
Я бы not exists
использовал:
SELECT t.*
FROM table t
WHERE t.sample_1 = 'T1' AND t.sample_2 = 'T3' AND
NOT EXISTS (SELECT 1 FROM table t2 WHERE t2.id = t.id);
Вы можете использовать эту технику на основе внешнего соединения:
select t1.*
from table t1
left join table t2
on t2.id = t1.id
and t2.sample1 = 'T2' and t2.sample2 = 'T3'
where t1.sample1 = 'T1' and t1.sample2 = 'T3'
and t2.id is null
Он работает, потому что внешние соединения возвращают значения NULL, если нет соединения, и вы возвращаете только те, которые через t2.id is null
условием в предложении where
.
Большим преимуществом этого метода является эффективное использование индекса в столбце id
; эта техника, как правило, выходит за пределы других приложений. Плюс ИМХО это быстрый поиск.
Обратите внимание, что условие для столбцов sample
должно быть в условии соединения для t2
, иначе вы бы эффективно получили внутреннее соединение, победив требуемое внешнее соединение.
t1
и t2
- псевдонимы для каждой из ссылок на table
, без которых ссылки на столбцы в table
были бы неоднозначными. Этот запрос возвращает то, что вы хотите, т.е. только те строки, где «Time 1» и «Time 3» существуют для одного идентификатора, но нет «Time 2» / «Time 3» для этого идентификатора.
Здесь будет угрюмая работа:
Выберите отдельный идентификатор, * из таблицы Где sample1 = 't1' и sample2 = 't3'