下午的时候遇到点问题,Sql去重,简单的去重能够用 DISTINCT 关键字去重,不过,不少状况下用这个解决不了问题。重复的数据变幻无穷,例如:相似于qq、微信的最近联系人功能,读取这些数据确定要和消息表关联,那样关联的数据会出现不少重复的,只是消息和时间不同。最终的决定条件是最后一次发消息的时间。那么问题来了,如何作呢sql
SELECT colName FROM ( SELECT MAX(cloName1),cloName2..... FROM tableName(关联表) GROUP BY colName ) t ORDER BY t.colName
这句sql语句只能过滤数字类型和时间,对于其余的去重条件仍是不够的,能够用ROW_NUMBER()来作,Sql以下:微信
SELECT t.Id, t.PCName, t.rowid FROM ( SELECT Id, PCName, ROW_NUMBER() OVER (PARTITION BY PCName ORDER BY Id) AS rowid FROM dbo.PC ) AS t WHERE t.rowid = 1;
下面是根据having去作的例子:spa
a.根据某一列查询重复数据Sql以下:code
select * from A where Id in (select Id from A group by Id having count(Id) > 1)
根据多个列查询重复数据Sql以下:blog
select * from A a where (a.Id,a.gender) in (select Id,gender from A group by Id,gender having count(*) > 1)