У меня есть таблица, в которой хранятся данные, соответствующие уникальному идентификатору, который клопирует несколько записей, чтобы сделать его частью группы. Я хочу проверить, существует ли в этой группе значение для столбца, но не в другом столбце. Я попытался с предложением group by, где предложение, но я не получаю ожидаемых записей. Любая помощь будет оценена.
id Group receiver sender sender_role
1 a Val1 Val2 Guest
2 a Val1 Val2 Guest
3 b Val3 Val4 CC
4 b Val4 Val3 Guest
5 b Val4 Val3 Guest
6 c Val5 Val6 Guest
В приведенной выше таблице мне нужно сгруппировать чат и найти в этой группе имя должно существовать в приемнике, но не в отправителе вообще.
Здесь в группе а, например, ищу VAL1, поэтому он соответствует условию, чтобы быть в и приемнике в отправителе вообще.
1 a Val1 Val2 Guest
2 a Val1 Val2 Guest
Здесь в группе b, например, для поиска Val3, поэтому он не соответствует условию, поскольку Val3 существует как в приемнике, так и в отправителе.
3 b Val3 Val4 CC
4 b Val4 Val3 Guest
5 b Val4 Val3 Guest
Здесь, в группе c, например, для поиска Val5, он соответствует условию, поскольку Val5 существует в приемнике, а не в отправителе.
6 c Val5 Val6 Guest.
Один простой подход использует условную агрегацию для утверждения ваших условий:
SELECT 'Group'
FROM yourTable
GROUP BY 'Group'
HAVING
SUM(CASE WHEN receiver = 'Val1' THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN sender = 'Val1' THEN 1 ELSE 0 END) = 0;
Кстати, не называйте столбцы Group
, иначе вам придется окружать это имя столбца обратными окнами каждый раз, когда вы его используете.
select a.*
from your_table a
where not exists
(select null from your_table b where
a.'group'=b.group and a.receiver=b.sender);
Я думаю, вы ищете что-то вроде этого:
select t.*
from t
where exists (select 1
from t t2
where t2.group = t.group and t2.receiver = 'Val1'
) and
not exists (select 1
from t t2
where t2.group = t.group and t2.sender = 'Val1'
);
Это для вашего первого состояния. Остальные схожи.