如何按相同ID分组合并行以去除空值并整合关联数据?
问题解决:分组筛选目标记录
问题背景
现有含重复分组的数据集,需每个分组仅保留特定单条记录;尝试GROUP BY和ROW_NUMBER()方法未达预期。
正确实现方案
方法1:ROW_NUMBER()分区筛选(推荐)
通过CTE或子查询给每个分组内的记录按规则编号,筛选编号为1的记录:
WITH ranked_data AS ( SELECT *, -- 按分组字段分区,按排序字段倒序编号,取每组第一条 ROW_NUMBER() OVER (PARTITION BY 分组字段 ORDER BY 排序字段 DESC) AS rn FROM 你的数据表 ) SELECT * FROM ranked_data WHERE rn = 1;
- 替换
分组字段:比如用户ID、类别ID等用于分组的字段 - 替换
排序字段:比如创建时间、金额等决定保留哪条记录的字段,DESC取最新/最大值,ASC取最早/最小值 - 若分组内有并列值(如同分组同排序值),可改用
RANK()或DENSE_RANK()
方法2:GROUP BY+关联查询
先通过聚合找到分组内目标字段的极值,再关联原表获取完整记录:
SELECT t.* FROM 你的数据表 t JOIN ( SELECT 分组字段, MAX(目标字段) AS target_val FROM 你的数据表 GROUP BY 分组字段 ) agg ON t.分组字段 = agg.分组字段 AND t.目标字段 = agg.target_val;
- 若分组内目标字段有多个相同极值,该方法会返回多条记录,需结合
ROW_NUMBER()进一步筛选
常见错误排查
- 遗漏
ROW_NUMBER()的PARTITION BY子句,导致全表统一编号而非分组编号 GROUP BY时直接选择非聚合字段,返回的记录不符合预期- 排序字段选择错误,导致保留的不是目标记录
内容的提问来源于stack exchange,提问作者rania
相关产品推荐
相关产品推荐

