Sql 处理重复记录(相同ID取另一字段最大值)

Introduction

在SQL的Select过程中,考虑如下冗余:对于同一个ID,有一行字段标识了该记录的处理日期/处理方式,现在需要任意保留一个或取较新/旧的记录。

Content

Description

ID相同,TYPE只有一个,保留所有记录。
ID相同,TYPE出现了多个,保留任意一个或值最大/最小的所有记录。

Example

KeyID ID TYPE ATT1 ATT2 ATT3 ATT4
1 1001 Daily A 4K 8K description1
2 1001 Daily A 2K 4K description2
3 1001 Manual A 4K 8K description1
4 1001 Manual A 2K 4K description2
5 1005 Daily B 4K 8K description3
6 1010 Manual C 4K 8K description4

Result

KeyID ID TYPE ATT1 ATT2 ATT3 ATT4
1 1001 Daily A 4K 8K description1
2 1001 Daily A 2K 4K description2
5 1005 Daily B 4K 8K description3
6 1010 Manual C 4K 8K description4

Solution

Select 筛选

ID相同取最小TYPE

1
2
3
4
5
6
7
8
方法1:(推荐在数据量较大时使用)
select * from Temp A where TYPE=(select min(TYPE) from Temp where ID=A.ID)
方法2:
Select * from Temp A where not exists(select 1 from Temp where ID=A.ID and TYPE<A.TYPE)
方法3:
select A.* from Temp A join (select min(TYPE)TYPE,ID from Temp group by ID) B on A.ID=B.ID and A.TYPE=B.TYPE

ID相同取最大TYPE

1
2
3
4
5
6
7
8
方法1:(推荐在数据量较大时使用)
select * from Temp A where TYPE=(select max(TYPE) from Temp where ID=A.ID)
方法2:
Select * from Temp A where not exists(select 1 from Temp where ID=A.ID and TYPE>A.TYPE)
方法3:
select A.* from Temp A join (select max(TYPE)TYPE,ID from Temp group by ID) B on A.ID=B.ID and A.TYPE=B.TYPE