最简单的删除重复记录(只保留一条)的SQL方法

首先,新建一张表用于示例说明:

# 新建一张表A
create table A( id varchar(5), name varchar(5), salary float);

# 插入数据(包含要去除的重复记录)
insert into A VALUES
( '01', 'John', 3800),
('02','Tom',5000),
('02','Tom',10000),
('03','Sam',8600);

得到测试用的表如下:
在这里插入图片描述
这里,我们定义的重复记录是:只要“name"的字段值重复就认为两条记录是重复的(单字段重复记录)。

----------------------------------------开始去重操作-------------------------------------------

第一种情况:去重所有的重复记录,只保留第一条

去重目标:当"name"的字段值有重复时,只保留第一条记录,删除其余所有重复记录。

第一步: 按照‘name"字段分组并对组内每条记录进行编号:

select A.*, row_number() over( partition by name ) 工资排名
from A; 

在这里插入图片描述

第二步:去重(即筛选出每个name的第一条记录,这样就排除了其他重复记录):

select * 
from 
(select A.*, row_number() over( partition by name ) 工资排名
from A) t 
where 工资排名=1; 

结果如下:
在这里插入图片描述

第二种情况: 去除指定条件的重复记录,只保留第一行

现在只去除"name"字段中'Tom"对应的重复记录,其他人是否有重复记录不用管。

第一步:找出"Tom"的重复记录(按照name字段分组后”Tom"的第一条记录以外的其他记录)

select id,name,salary
from 
(select A.*, row_number() over() 记录编号
from A
where name='Tom') t 
where 记录编号 !=1;  

得到结果如下:
在这里插入图片描述

注意: 序号函数(row_number(), dense_rank(),rank())必须结合开窗函数“over()"使用,即使"over()"不带有任何参数(如本部分去重操作)。

第二步: 从原表中排除上一步得到的记录

select *
from A
where 
(id,name,salary) NOT IN    # 排除操作 

(select id,name,salary
from 
(select A.*, row_number() over() 记录编号
from A
where name='Tom') t 
where 记录编号 !=1); 

得到最终结果如下:
在这里插入图片描述


版权声明:本文为grandesucesso原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。