Я бы просто использовал exists
:
select t.*
from mytable t
where exists (
select 1 from mytable t1 where t1.grpid = t.grpid and t1.custuserid is not null
)
Коррелированный подзапрос гарантирует, что хотя бы одна запись с тем же grpid
имеет ненулевое значение custuserid
. Для производительности вам нужен индекс на (grpid, custuserid)
.
. Вы также можете использовать оконные функции:
select *
from (
select t.*, max(custuserid) over(partition by grpid) max_custuserid
from mytable t
) t
where max_custuserid is not null
Или вы можете присоединиться к агрегированному запросу:
select t.*
from mytable t
inner join (
select
grpid,
max(custuserid)
from mytable
group by grpid
having max(custuserid) is not null
) x on x.grpid = t.grpid
Какой вариант будет работать лучше всего, зависит от набора данных (размер, количество элементов, ...).