SQL分组筛选实现:按splitlevel规则返回目标行
针对用户分组筛选需求的SQL实现方案
核心需求是按name分组,优先返回该组内splitlevel为SplitCode的所有行;如果该组没有SplitCode行,则返回splitlevel为AccountCode的行。以下提供两种高效实现方式:
方法一:使用窗口函数标记分组状态
通过窗口函数给每个name组标记是否存在SplitCode行,再基于标记筛选目标数据:
SELECT d.* FROM ( SELECT *, -- 标记当前name组是否存在SplitCode行 MAX(CASE WHEN splitlevel = 'SplitCode' THEN 1 ELSE 0 END) OVER (PARTITION BY name) AS has_splitcode FROM details ) d WHERE -- 有SplitCode的组,只保留SplitCode行 (has_splitcode = 1 AND splitlevel = 'SplitCode') -- 无SplitCode的组,保留AccountCode行 OR (has_splitcode = 0 AND splitlevel = 'AccountCode');
方法二:使用EXISTS子查询直接判断
通过子查询判断当前name组是否存在SplitCode行,以此作为筛选条件:
SELECT * FROM details d WHERE -- 直接保留所有SplitCode行 splitlevel = 'SplitCode' -- 仅当当前name组没有SplitCode行时,保留AccountCode行 OR ( splitlevel = 'AccountCode' AND NOT EXISTS ( SELECT 1 FROM details WHERE name = d.name AND splitlevel = 'SplitCode' ) );
关于你之前的问题说明
你之前尝试用row_number()但结果不理想,大概率是因为PARTITION BY的维度选错了——应该按name分组来判断每个用户的行状态,而不是date。
内容的提问来源于stack exchange,提问作者Rv02
相关产品推荐
相关产品推荐

