#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