2016-11-21 3 views
2

У меня есть таблица с тремя столбцами Member, id и DOB. Я хочу присвоить идентификатор каждому уникальному члену. Если для члена указано более одного идентификатора, тогда мне нужно назначить id с большей повторяемостью. Если возникает связь, я должен назначить идентификатор с последним DOB.Сравнение значений в столбце с использованием sql

4000 8569 11/11/1993 
4111 9653 12/11/1993 
4000 8569 12/12/1993 
5000 5632 01/01/1993 
4000 6932 31/12/1993 
4111 6987 06/11/1993 
5001 4356 01/01/1993 

В выше, член-х 5000 и 5001 привязывается к одной ид .. Так что я должен получить тот же идентификатор для этого участника .. Если для элемента 4000 Я имею 3 id's- 2 одинаковые идентификаторы (8569) и один другой идентификатор (6987). Здесь у меня должно быть 8569, помеченных этому 4000 члену. Для члена 4111 у меня есть два разных идентификатора (9653 и 6987). Поэтому я увижу недавний DOB для этого участника. Таким образом, для 4111 члена я буду отмечен тегом 9653.

Результат должен быть таким:

4000 8569 
4111 9653 
5000 5632 
5001 4356 

Я попытался много. Но я не мог получить точный ответ. Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.

ответ

1

Вы можете сделать это с window functions in t-sql:

create table #t (
    Member int, 
    id int, 
    DOB date 
); 

insert into #t 
values (4000, 8569, '1993-11-11'), 
     (4111, 9653, '1993-11-12'), 
     (4000, 8569, '1993-12-12'), 
     (5000, 5632, '1993-01-01'), 
     (4000, 6932, '1993-12-31'), 
     (4111, 6987, '1993-11-06'), 
     (5001, 4356, '1993-01-01'); 

with cte as 
(
    select *, count(id) over (partition by member, id) cnt from #t 
), 
cte2 as 
(
    select *, row_number() over (partition by member order by cnt desc, dob desc) rn from cte 
) 
select member, id from cte2 where rn = 1; 

drop table #t;