Oracle SQL:保留首值清除Name_1与Proximity列重复值(不删行)
Oracle SQL 解决方案:保留重复组首次值,后续置空
核心思路
用窗口函数ROW_NUMBER()对同一Structure_no下的Name_1和Proximity组合分组编号,仅保留每组首行的原值,后续行对应列置空;同时处理NULL值的分组问题,满足“忽略Name_1和Proximity均为NULL的重复行”的需求。
适配SQL代码
WITH base_data AS ( -- 替换为你的原始查询语句 SELECT * FROM your_source_table_or_query ) SELECT Structure_no, -- 处理Name_1列:仅保留每组首次出现的值,重复行置空 CASE WHEN ROW_NUMBER() OVER ( PARTITION BY Structure_no, NVL(Name_1, 'UNIQUE_NULL_MARKER'), NVL(Proximity, 'UNIQUE_NULL_MARKER') ORDER BY your_order_column -- 替换为实际排序字段(如ID、创建时间),确定"首次出现"的顺序 ) = 1 THEN Name_1 ELSE NULL END AS Name_1, -- 处理Proximity列:逻辑同Name_1 CASE WHEN ROW_NUMBER() OVER ( PARTITION BY Structure_no, NVL(Name_1, 'UNIQUE_NULL_MARKER'), NVL(Proximity, 'UNIQUE_NULL_MARKER') ORDER BY your_order_column ) = 1 THEN Proximity ELSE NULL END AS Proximity, -- 保留所有其他原始列(替换为你的实际列名) other_column_1, other_column_2, other_column_3 FROM base_data -- 可选:如果需要完全过滤掉Name_1和Proximity均为NULL的行,取消注释下面的WHERE子句 -- WHERE NOT (Name_1 IS NULL AND Proximity IS NULL) ;
关键说明
- NULL值分组处理:Oracle中
NULL不参与等值比较,因此用NVL()将NULL转换为唯一标识字符串(如UNIQUE_NULL_MARKER),确保相同的NULL组合能被分到同一组。 - 首次出现的排序依据:
ORDER BY your_order_column需替换为实际存在的字段(比如主键ID、数据创建时间),否则ROW_NUMBER()的编号顺序不确定。若无明确排序字段,可临时用ORDER BY (SELECT NULL),但不推荐用于生产环境。 - 忽略双NULL行的两种方式:
- 若仅需将双NULL的重复行对应列置空,无需额外过滤;
- 若要完全删除这些行,取消注释代码中的
WHERE子句即可。
内容的提问来源于stack exchange,提问作者ar ia
相关产品推荐
相关产品推荐

