2016-11-21 37 views
2

我有一個包含三列Member,id和DOB的表。我想爲每個唯一成員分配一個id。如果爲成員標記了多個id,那麼我必須爲id指定更多的重複。如果發生聯繫,那麼我必須爲最近的DOB分配id。使用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被標記爲單ID ..所以我應該得到相同的ID爲成員..而對於成員4000我有3個id's- 2個相同的IDS(8569)和一個不同的id(6987)。在這裏,我應該將8569標記給這個4000成員。對於4111成員,我有兩個不同的ID(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;