如何在SQL中按列条件筛选唯一值?重复数据处理求助
解决SQL中针对特定worker_id去重的需求
你的核心需求是只对worker_id=1的记录去重,保留唯一一条,其他所有记录(包括worker_id为NULL或其他值的)全部保留,直接按worker_id分组会误删其他数据,用窗口函数可以精准实现这个逻辑。
解决方案:使用ROW_NUMBER()窗口函数
通过给每个worker_id分组的记录添加行号,仅对worker_id=1的组筛选行号为1的记录,其他组的记录全部保留。
SQL示例代码
WITH ranked_data AS ( SELECT id, vehicle_id, worker_id, user_type, user_fullname, -- 对相同worker_id的记录编号,排序规则决定保留哪一条(这里按id降序,保留最新的记录) ROW_NUMBER() OVER (PARTITION BY worker_id ORDER BY id DESC) AS row_num FROM your_table ) SELECT id, vehicle_id, worker_id, user_type, user_fullname FROM ranked_data -- 筛选逻辑:要么是worker_id≠1/NULL的所有记录,要么是worker_id=1且行号为1的记录 WHERE (worker_id = 1 AND row_num = 1) OR worker_id != 1 OR worker_id IS NULL;
逻辑解释
- 窗口函数分组编号:
PARTITION BY worker_id把相同worker_id的记录归为一组,ORDER BY id DESC决定组内排序(这里选id大的,对应你期望输出中保留id=13的Stephen记录),ROW_NUMBER()给每组内的记录从1开始编号。 - 精准筛选:WHERE条件确保只有worker_id=1的组只留第一条,其他所有记录(包括worker_id为NULL的John和Peter)都完整保留,不会误删任何非目标重复的数据。
调整保留规则
如果想保留worker_id=1的最早记录,只需把ORDER BY id DESC改成ORDER BY id ASC即可,这样会保留id=11的记录(可根据实际需求调整排序字段)。
内容的提问来源于stack exchange,提问作者K1m4
相关产品推荐
相关产品推荐

