Найти группу записей, которые соответствуют нескольким значениям
У меня есть следующие данные:
ID --- ParentID --- DataValue
1 --- 1 --- 1
2 --- 1 --- 2
3 --- 1 --- 6
4 --- 2 --- 1
5 --- 2 --- 2
6 --- 2 --- 4
7 --- 3 --- 1
8 --- 3 --- 3
9 --- 3 --- 5
Для каждой группы записей (сгруппированных по ParentID) я хотел бы найти все группы, которые соответствуют всем заданным значениям в DataValue, например:
- для значений (1,2) ParentID 1 и 2 будут возвращены
- для значений (1,6) будет возвращен только ParentID 1 (группа ParentID 2 не содержит 6)
Я посмотрел на этот вопрос, который очень похож, но OP ищет группы, которые не содержат одно значение.
Любая помощь очень ценится!
1 ответ
Решение
Вы можете сделать это с помощью условного агрегирования:
select parentid
from tablename
group by parentid
having sum(case when datavalue = 1 then 1 else 0 end) > 0 and
sum(case when datavalue = 6 then 1 else 0 end) > 0
Другим способом является использование exists
:
select distinct parentid
from tablename t1
where exists(select * from tablename where parentid = t1.parentid and datavalue = 1) and
exists(select * from tablename where parentid = t1.parentid and datavalue = 6)
Еще один способ подсчета различных случаев:
select parentid
from tablename
where datavalue in(1, 6)
group by parentid
having count(distinct datavalue) = 2