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

如何在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;

逻辑解释

  1. 窗口函数分组编号:PARTITION BY worker_id把相同worker_id的记录归为一组,ORDER BY id DESC决定组内排序(这里选id大的,对应你期望输出中保留id=13的Stephen记录),ROW_NUMBER()给每组内的记录从1开始编号。
  2. 精准筛选: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:15:34