2014-01-30 4 views
0
CREATE TABLE #A (Type Char(20),ID INT, ID2 int,Address VARCHAR(10)) 
INSERT INTO #A (Type,ID, ID2,Address) 
VALUES ('Child',101,290,'CAT'), 
     ('Child',102,290,'CAR'), 
     ('Self',290,290,'CAT') 
     ,('Spouse',103, 777,'DOE') 
     ,('Self',777,777,'DOE') 
     ,('Self',811,NULL,'yyy') 

Таким образом, идентификатор уникален в #A, а ID2 группируется так, записи 1-3 находятся в одной группе 4-5 в одной группе и так далее. Я хочу показать все «ID», где (i) для каждой группы, если адрес одинаковый для всех записей, я хочу получить идентификатор, где type = 'self' (ii) если каждая группа, если адрес разные для нескольких записей, я хочу получить идентификатор «я» и идентификатор других рекомендаций, где адрес отличается. (iii) если нет группы i.e. ID2 имеет значение null, я хочу идентификатор записей.Выбор группы записей по

так, вывод должен быть

102 
290 
777 
811 

устранения ID 101, потому что 290 имеет тот же адрес, и они принадлежат к одной и той же группе. хранение 290, потому что это само.

Спасибо!

ответ

1

Чтобы решить эту проблему, мне представляется полезным перевести условия на флаги/меры в каждой строке. Функции окна очень полезны для этого.

Следующие реализует три правила:

select type, id, id2, address 
from (select a.*, 
      rank() over (partition by id2 order by AddressCnt desc) as AddressRank 
     from (select a.*, 
        (case when max(address) over (partition by id2) = 
           min(address) over (partition by id2) 
         then 1 else 0 
        end) as AddressSame, 
        count(*) over (partition by id2, Address) as AddressCnt 
      from a 
      ) a 
    ) a 
where (AddressSame = 1 and type = 'self') or 
     (AddressRank > 1 or type = 'self') or 
     id2 is null; 

SQL, скрипка here.

Смежные вопросы