Sql去重一些技巧
下午的时候遇到点问题,Sql去重,简单的去重可以用 DISTINCT 关键字去重,不过,很多情况下用这个解决不了问题。重复的数据千变万化,例如:类似于qq、微信的最近联系人功能,读取这些数据肯定要和消息表关联,那样关联的数据会出现很多重复的,只是消息和时间不一样。最终的决定条件是最后一次发消息的时间。那么问题来了,如何做呢
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去做的例子:
a.根据某一列查询重复数据Sql如下:
select * from A where Id in (select Id from A group by Id having count(Id) > 1)
根据多个列查询重复数据Sql如下:
select * from A a where (a.Id,a.gender) in (select Id,gender from A group by Id,gender having count(*) > 1)