Найти группу записей, которые соответствуют нескольким значениям

У меня есть следующие данные:

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
Другие вопросы по тегам