Выберите отдельные строки на основе столбца и двух условий в SQL

0

Я хотел бы получить строки из этого набора данных, где существует значение 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

Хотя я не уверен, что доверяю коду.

  • 0
    Отредактировано, чтобы включить прогресс.
Теги:

4 ответа

1

Вы можете использовать его 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'
                  );
0

Я бы 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);
0

Вы можете использовать эту технику на основе внешнего соединения:

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, иначе вы бы эффективно получили внутреннее соединение, победив требуемое внешнее соединение.

  • 0
    С моей стороны это может сбивать с толку, но мои данные - это одна таблица, а T1 и T2 сокращены от «Time 1» и «Time 2». Могут быть дублирующие идентификаторы, потому что T1, T2, T3 являются двоичными сравнениями, которые определяют разницу между временными точками. Поэтому я хочу вернуть только те строки, где «Time 1» и «Time 3» существуют для одного идентификатора, но «Time 2» / «Time 3» не существует для этого идентификатора.
  • 0
    @ user974887 t1 и t2 - псевдонимы для каждой из ссылок на table , без которых ссылки на столбцы в table были бы неоднозначными. Этот запрос возвращает то, что вы хотите, т.е. только те строки, где «Time 1» и «Time 3» существуют для одного идентификатора, но нет «Time 2» / «Time 3» для этого идентификатора.
Показать ещё 3 комментария
-1

Здесь будет угрюмая работа:

Выберите отдельный идентификатор, * из таблицы Где sample1 = 't1' и sample2 = 't3'

  • 0
    Это не работает, потому что я хочу исключить другие комбинации T1 / T2 / T3, а не просто скрининг для уникальных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню