如何实现用户记录筛选: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
相关产品推荐
相关产品推荐

