SQL查询需求:识别重复original_ctr_id并替换为对应最大ctr_id
解决方案:替换重复original_ctr_id为对应组最大ctr_id
要实现你需要的逻辑——检查original_ctr_id是否重复,重复的话就把该组所有行的这个字段替换成对应组里最大的ctr_id,用窗口函数是最适合的方案,既不用聚合整行丢失数据,又能拿到分组后的统计值。
直接上可用的SQL:
SELECT -- 判断当前original_ctr_id是否重复,重复则用组内最大ctr_id替换 CASE WHEN COUNT(*) OVER (PARTITION BY original_ctr_id) > 1 THEN MAX(ctr_id) OVER (PARTITION BY original_ctr_id) ELSE original_ctr_id END AS new_original_ctr_id, -- 保留原表的其他列,这里示例保留ctr_id,有其他列直接加在这里即可 ctr_id FROM [MIS].[dbo].[Test] ORDER BY new_original_ctr_id;
代码说明:
COUNT(*) OVER (PARTITION BY original_ctr_id):统计每个original_ctr_id对应的行数,行数大于1就说明这个值重复了MAX(ctr_id) OVER (PARTITION BY original_ctr_id):计算同一个original_ctr_id分组里的最大ctr_id值- CASE语句根据是否重复,决定用替换值还是保留原来的original_ctr_id
- 这个写法不会像GROUP BY那样合并行,能完整保留原表的所有行数据,完全符合你的需求
你之前用GROUP BY的问题在于,它会把同一original_ctr_id的行合并成一行,丢失了原始的多行数据,而窗口函数OVER(PARTITION BY)是在不改变行结构的前提下做分组统计,正好解决你的痛点。
内容的提问来源于stack exchange,提问作者Elarbe
相关产品推荐
相关产品推荐

