选择记录组

时间:2014-01-30 16:49:54

标签: sql group-by

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')

因此,ID在#A中是唯一的,而ID2正在分组,因此,记录1-3在一组中的4-5组中,依此类推。 我想显示所有“ID”在哪里 (i)对于每个组,如果所有记录的地址相同,我想得到type ='self'的ID (ii)如果每个组,如果地址对于少数记录是不同的,我想获得self的ID和地址不同的其他recods的ID。 (iii)如果没有组,即ID2为空,我想要记录的ID。

所以,输出应该是

102
290
777
811 

消除ID 101,因为290具有相同的地址并且它们属于同一组。 保持290,因为它是自我。

谢谢!

1 个答案:

答案 0 :(得分: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