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
相关产品推荐
相关产品推荐

