如何在存在Lidl德国行时过滤Lidl奥地利行,保留其他品牌奥地利行
实现思路与SQL方案
核心逻辑拆解:只针对Lidl品牌做特殊处理——如果该品牌同时存在Germany和Austria的记录,仅保留Germany行、剔除Austria行;其他品牌的所有记录(包括Austria行)全部保留。
方案一:用EXISTS子句直接过滤
这种写法逻辑直观,直接针对需要剔除的特定场景做判断:
SELECT Brand, Country FROM your_table WHERE NOT ( Brand = 'Lidl' AND Country = 'Austria' -- 仅当Lidl存在Germany记录时,才剔除对应的Austria行 AND EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Brand = 'Lidl' AND t2.Country = 'Germany' ) )
原理:只有同时满足「是Lidl的Austria行」且「该品牌存在Germany行」这两个条件的记录才会被过滤,其他所有记录都保留。
方案二:用窗口函数标记辅助列
适合需要扩展更多品牌规则的场景,可维护性更强:
WITH brand_status AS ( SELECT *, -- 给每个品牌标记是否存在Germany的记录 MAX(CASE WHEN Country = 'Germany' THEN 1 ELSE 0 END) OVER (PARTITION BY Brand) AS has_germany FROM your_table ) SELECT Brand, Country FROM brand_status WHERE -- 非Lidl品牌直接保留所有行 Brand <> 'Lidl' -- Lidl品牌仅保留Germany行,或该品牌无Germany记录时保留Austria行 OR (Brand = 'Lidl' AND (Country = 'Germany' OR has_germany = 0))
原理:先通过窗口函数给每个品牌分组,判断该品牌是否有Germany的记录;再基于标记的辅助列,对Lidl品牌做针对性过滤,其他品牌不受影响。
内容的提问来源于stack exchange,提问作者Hans Peter
相关产品推荐
相关产品推荐

