Как я уже упоминал в комментариях, правило, по которому определяется «дубликат», неясно. Тем не менее, по звукам, вы просто делаете побитовое И.
With RawData As
(
Select 1 As id, 1 As service_1, 1 As service_2
Union All Select 2, 1, 0
Union All Select 3, 0, 1
)
, BinData As
(
Select A.id, A.service_1, A.service_2
, A.service_1 * 2 + A.service_2 As Bin
From RawData As A
)
Select *
From BinData As F1
Left Join BinData As F2
On F2.id <> F1.id
And F1.Bin & F2.Bin = 0
Order By F1.id
Однако в этом решении вы заметите, что я получаю строку для id = 3. По той же причине, что id = 3 является «дубликатом» для id = 2, верно и обратное.
Если это не правильно, нам нужно гораздо больше ясности и несколько лучших выборочных данных, которые иллюстрируют крайние случаи того, что является и не является «дубликатом».
Обновление
Учитывая то, что кибервики указали в комментариях, если то, что ищется для каждого плана, - это другой план, который при объединении предоставляет все услуги ровно один раз, то то, что запрашивается, - это комплимент в двоичном виде, который произведет все 1. Мы можем сделать это, найдя все планы, которые, когда XOR будет соответствовать текущему плану, произведут все:
With RawData As
(
Select 1 As id, 1 As service_1, 1 As service_2
Union All Select 2, 1, 0
Union All Select 3, 0, 1
)
, BinData As
(
Select A.id, A.service_1, A.service_2
, A.service_1 * 2 + A.service_2 As Bin
From RawData As A
)
Select *, F1.Bin ^ F2.Bin
From BinData As F1
Left Join BinData As F2
On F2.id <> F1.id
And F1.Bin ^ F2.Bin = 3
Order By F1.id
Опять же, обратите внимание, что id = 3 будет отображаться в результате, потому что так же, как id = 3 идеально подходит для id = 2, обратное также верно.