ORACLE清除某一字段重复的数据(选取重复数据中另一个字段时期最大值)

需求:资产维修表中同一资产可能维修完继续申请维修,这时候维修状态需要根据最近的维修时间去判断维修状态,所以同一资产ID下会出现重复的数据(维修审批通过,维修审批未通过),或者可能不出现(未申请维修),所以需要查询资产维修表中未重复的数据和重复的数据中申请维修日期最近的数据,方法如下:

资产表如下:

ORACLE清除某一字段重复的数据(选取重复数据中另一个字段时期最大值)

1、资产维修中所有的数据
select * from ASSET_MAINTAIN t

结果如下:

ORACLE清除某一字段重复的数据(选取重复数据中另一个字段时期最大值)

2、资产维修中可能相同的数据
select a.*  from ASSET_MAINTAIN a inner join ASSET_MAINTAIN b on a.asset_id=b.asset_id and a.rowid!=b.rowid

结果如下:

ORACLE清除某一字段重复的数据(选取重复数据中另一个字段时期最大值)

3、查询相等的数据中保管日期最大的一条
select * from ASSET_MAINTAIN where maintain_start_date in (select max(n.maintain_start_date) from ASSET_MAINTAIN n group by n.asset_id having count(n.asset_id) > 1)

结果如下:

ORACLE清除某一字段重复的数据(选取重复数据中另一个字段时期最大值)

4、查询资产维修中所有的数据(不包括相同的数据)
select * from ASSET_MAINTAIN t where t.asset_id not in(select a.asset_id  from ASSET_MAINTAIN a inner join ASSET_MAINTAIN b on a.asset_id=b.asset_id and a.rowid!=b.rowid)

ORACLE清除某一字段重复的数据(选取重复数据中另一个字段时期最大值)

最后,将相同字段,不同数据的两个子查询相关联:

(select * from ASSET_MAINTAIN t where t.asset_id not in(select a.asset_id  from ASSET_MAINTAIN a inner join ASSET_MAINTAIN b on a.asset_id=b.asset_id and a.rowid!=b.rowid)) union all
(select * from ASSET_MAINTAIN where maintain_start_date in (select max(n.maintain_start_date) from ASSET_MAINTAIN n group by n.asset_id having count(n.asset_id) > 1))

结果如下:

ORACLE清除某一字段重复的数据(选取重复数据中另一个字段时期最大值)

上一篇:2016年12月3日 星期六 --出埃及记 Exodus 20:24


下一篇:Android开发技巧!如何才能更容易拿到大厂Offer?深度解析,值得收藏