select max(Time),外键字段 from t
group by 外键字段
先获取获取重复数据的最近一行
再union all 其他不重复数据
select top 1 外键字段 from t where 外键字段 in (select 外键字段 from t group by 外键字段 Having COUNT(*)>1) order by time union all select 外键字段 from t where 外键字段 in (select 外键字段 from t group by 外键字段 Having COUNT(*)=1)
或者不使用Union,自行先返回“重复数据的最近一行”,再除去重复数据的编号查询不重复数据,再合并效率会高些
首先使用row_number() over (partition by 外键字段 order by 时间 desc),然后将row_number大于1的选择出来,作为子查询。
selec *
from(
select *,row_number() over (partition by 外键字段 order by 时间 desc) as ‘排名’
from 表名)
as T
where 排名 > 1
这样既可以选择出只有一个记录的行,又可以选择出多行记录组中时间最近的记录。