SQL Server 2008:选择一个记录,分组依据

时间:2014-02-27 02:58:48

标签: sql sql-server group-by

我有一张桌子

#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。

由于

1 个答案:

答案 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找到它。