我有一张桌子
#tblA (mem_id int, type varchar(20), address1 varchar(20),group_id int)
insert into #tblA (mem_id, type, address1,group_id)
values (1,'self','abc St',1),
(2,'Child','abc St',1),
(3,'Child','xyz st',1),
(4,'spouse','pqr st',1),
(5,'Child','abc St',1),
(6,'Child','xyz st',1),
(7,'self','mno st',2),
(8,'Child','def St',2),
(9,'Child','def st',2),
我想只选择住在不同地址的孩子和配偶。此外,如果来自小组的两个人居住在与自己不同的地址,那么我只需要一个人。
这是预期的结果:
(3, 'Child', 'xyz st', 1),
(4, 'spouse', 'pqr st', 1),
(8, 'Child', 'def St', 2),
消除id2和id5,因为它的地址与id1相同。消除id6,因为我们已经在结果中获得了id3。消除id7,因为它是self和id9,因为我们已经获得了相同地址的id8。
由于
答案 0 :(得分:1)
你的逻辑相当复杂。以下查询采用首先获取所有候选“配偶”和“子”记录的方法。然后,它使用row_number()
:
select a.*
from (select a.*,
row_number() over (partition by group_id, type order by mem_id) as seqnum
from tbla a
where a.type <> 'self' and
a.address1 <> (select address1
from tbla a2
where a2.group_id = a.group_id and
a2.type = 'self'
)
) a
where seqnum = 1;
您可以在SQL Fiddle找到它。