I have the below table:
Criteria:
Do not show results for grpid if there is a null custuserid for all grpid
grpid 145 should be seen as there is a custuserid on the second row.
Custid grpid custuserid date 101 145 12/30/19 101 145 dellf 1/1/20 101 255 dellf 1/1/20 201 456 1/1/20 201 555 smithr 1/1/20
output:
Custid grpid custuserid date 101 145 12/30/19 101 145 dellf 1/1/20 101 255 dellf 1/1/20 201 555 smithr 1/1/20
Best way to filter out these results?
I was thinking first_value could be used but is there a better way?
Advertisement
Answer
I would simpy use exists:
select t.*
from mytable t
where exists (
select 1 from mytable t1 where t1.grpid = t.grpid and t1.custuserid is not null
)
The correlated subquery ensures that at least one record with the same grpid has a non-null custuserid. For performance, you want an index on (grpid, custuserid).
You could also use window functions:
select *
from (
select t.*, max(custuserid) over(partition by grpid) max_custuserid
from mytable t
) t
where max_custuserid is not null
Or, you can join an aggregate query:
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
Which option performs best would depend on your dataset (size, cardinality, …).