Как вернуть идентификаторы с разными значениями между строками полей

#postgresql

#postgresql

Вопрос:

Я хотел бы возвращать идентификаторы с разными значениями между сегментами:

 | id    | segment     | quantity |
|-------|-------------|----------|
| 12345 | Control - A | 1        |
| 12345 | Control - B | 1        |
| 98765 | Control - A | 0        |
| 98765 | Control - B | 1        |
  

Вывод:

 | id    |
|-------|
| 98765 |
  

Я пробовал логику ОБРАЩЕНИЯ, разбиение и т.д., Но мне интересно, какой подход является оптимальным.

Комментарии:

1. теперь можно утверждать, что это 0 отличается от 1 того же, что 1 отличается от 0 — что сделало бы оба допустимыми для вывода;)

2. Вы обсуждаете деталь, которая имеет настолько малое значение, что она была опущена 😉

Ответ №1:

Я считаю, что в таких случаях проще всего использовать предложение EXISTS, но другой ответ с самосоединением также должен работать просто отлично.

 select distinct id 
from t1 where exists 
  (select 1 
   from t1 t1_alias 
   WHERE t1.id = t1_alias.id and 
   t1.segment != t1_alias.segment and 
   t1.quantity != t1_alias.quantity)
;
  

Ответ №2:

Возможно, это не оптимальный подход, но вы не упомянули об этом, я бы попробовал что-то вроде этого:

 select
    distinct t1.id
from
    table t1 inner join 
    table t2 on t1.id = t2.id and t1.quantity != t2.quantity and t1.segment != t2.segment