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,因为它是自我。
谢谢!
答案 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。