You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:11:12