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

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)
;

关键说明

  1. NULL值分组处理:Oracle中NULL不参与等值比较,因此用NVL()将NULL转换为唯一标识字符串(如UNIQUE_NULL_MARKER),确保相同的NULL组合能被分到同一组。
  2. 首次出现的排序依据:ORDER BY your_order_column需替换为实际存在的字段(比如主键ID、数据创建时间),否则ROW_NUMBER()的编号顺序不确定。若无明确排序字段,可临时用ORDER BY (SELECT NULL),但不推荐用于生产环境。
  3. 忽略双NULL行的两种方式:
    • 若仅需将双NULL的重复行对应列置空,无需额外过滤;
    • 若要完全删除这些行,取消注释代码中的WHERE子句即可。

内容的提问来源于stack exchange,提问作者ar ia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:27:23