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

Oracle中如何获取列值重复数据的唯一行?

在Oracle中剔除price和old_price重复的行(保留一行)

首先明确原表数据结构(假设表名为products):

SELECT id, price, old_price FROM products;

返回结果:

ID  PRICE  OLD_PRICE
1   5      5
2   5      5
3   7      8

我们需要剔除price和old_price完全相同的重复行,仅保留每组重复中的一行,得到如下结果:

ID  PRICE  OLD_PRICE
1   5      5
3   7      8

以下是几种实现方法:

方法1:使用ROW_NUMBER()窗口函数(灵活指定保留行)

通过窗口函数对price和old_price分组,给每组内的行编号,筛选出编号为1的行即可。可以通过排序规则指定保留哪一行(比如最小ID、最大ID)。

WITH ranked_data AS (
    SELECT 
        id, 
        price, 
        old_price,
        -- 按price和old_price分组,每组内按ID升序编号
        ROW_NUMBER() OVER (PARTITION BY price, old_price ORDER BY id) AS rn
    FROM products
)
SELECT id, price, old_price
FROM ranked_data
WHERE rn = 1;

如果想保留每组中ID最大的行,只需将ORDER BY id改为ORDER BY id DESC。

方法2:使用GROUP BY聚合(快速去重)

如果不需要指定保留特定ID,仅需每组重复的price+old_price对应任意一行,可以用GROUP BY结合聚合函数:

取每组最小ID

SELECT MIN(id) AS id, price, old_price
FROM products
GROUP BY price, old_price;

取每组任意ID(Oracle 12c+支持)

SELECT ANY_VALUE(id) AS id, price, old_price
FROM products
GROUP BY price, old_price;

方法3:直接删除原表中的重复行

如果需要修改原表,删除重复行只保留一行:

DELETE FROM products
WHERE id NOT IN (
    SELECT MIN(id)
    FROM products
    GROUP BY price, old_price
);

此语句会删除每组重复中除ID最小行之外的所有记录,若要保留ID最大行,将MIN(id)替换为MAX(id)即可。

内容的提问来源于stack exchange,提问作者Kaan Tuğberk Avlamaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:01:00