Примерно так ... с использованием оконной функции и условной сортировки.
declare @YourTable table (Site_Status varchar(64), Site_id int, Site_Contact varchar(64), ContactRole varchar(64))
insert into @YourTable
values
('Active',123,'Lilly','Owner'),
('Active',123,'Elan','RO'),
('Inactive',345,'Rose','Owner'),
('Inactive',345,'Jack','RO'),
('Active',678,'Robert','Owner'),
('Inactive',912,'Linda','RO'),
('Active',234,'Nick','Operator'),
('Inactive',456,'Frank','Operator')
select
t.*
from @YourTable t
inner join
(select
Site_id
,Site_Status
,ContactRole
,Active = row_number() over (partition by Site_id, Site_Status order by case
when Site_Status = 'Active' and ContactRole = 'RO' then 1
when Site_Status = 'Active' and ContactRole = 'Owner' then 2
when Site_Status = 'Active' and ContactRole = 'Operator' then 3
end)
,InActive = row_number() over (partition by Site_id, Site_Status order by case
when Site_Status = 'InActive' and ContactRole = 'Owner' then 1
when Site_Status = 'InActive' and ContactRole = 'RO' then 2
when Site_Status = 'InActive' and ContactRole = 'Operator' then 3
end)
from @YourTable) x on
x.Site_id = t.Site_id
and x.Site_Status = t.Site_Status
and t.ContactRole = x.ContactRole
and Active = 1
and InActive = 1