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

如何实现用户记录筛选:Add操作优先,去重保留目标记录

实现需求的几种SQL方法

你的目标是对每个用户优先保留Add操作记录;若用户无Add记录,则保留Remove记录,以下是几种高效的实现方式:

方法1:窗口函数(推荐,通用兼容性好)

通过ROW_NUMBER()给每个用户的记录按操作优先级排序,Add排首位,再取每个用户的第一条记录:

WITH ranked_actions AS (
    SELECT 
        UserName,
        Action,
        ROW_NUMBER() OVER (
            PARTITION BY UserName 
            ORDER BY CASE Action WHEN 'Add' THEN 1 ELSE 2 END
        ) AS rn
    FROM your_table_name
)
SELECT UserName, Action
FROM ranked_actions
WHERE rn = 1;

逻辑说明:PARTITION BY UserName按用户分组,ORDER BY将Add的优先级设为1(排在最前),最终只保留每个用户优先级最高的那条记录。

方法2:子查询筛选+合并结果

分两部分取数后合并:先获取所有用户的Add记录,再筛选出无Add记录的用户的Remove记录:

-- 提取所有Add操作记录
SELECT UserName, Action
FROM your_table_name
WHERE Action = 'Add'
UNION ALL
-- 提取无Add记录的用户的Remove操作记录
SELECT UserName, Action
FROM your_table_name t1
WHERE Action = 'Remove'
AND NOT EXISTS (
    SELECT 1 
    FROM your_table_name t2 
    WHERE t2.UserName = t1.UserName AND t2.Action = 'Add'
);

逻辑说明:UNION ALL合并两个结果集,确保每个用户只会出现一次,且优先保留Add记录。

方法3:聚合函数判断

通过聚合函数判断用户是否存在Add记录,直接生成目标结果:

SELECT 
    UserName,
    CASE 
        WHEN MAX(CASE Action WHEN 'Add' THEN 1 ELSE 0 END) = 1 THEN 'Add'
        ELSE 'Remove'
    END AS Action
FROM your_table_name
GROUP BY UserName;

逻辑说明:MAX(CASE...)用于检测用户是否有Add记录,存在则返回Add,否则返回Remove,适合仅需保留操作类型的场景。

内容的提问来源于stack exchange,提问作者user13520940

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:25:27