浅谈sql数据库去重
关于sql去重,我简单谈一下自己的简介,如果各位有建议或有不明白的欢迎多多指出。
关于sql去重最常见的有两种方式:distinct和row_number(),当然了row_number()除了去重还有很多其他比较重要的功能,一会我给大家简单说说我自己在实际中用到的。
假如有张userinfo表,如下图:
现在我们要去掉完全重复的数据:select distinct * from dbo.userinfo结果如下图:
但是现在有个新的需求,要把名字为‘张三'的去重,也就是相同名字的只要一条数据,要是还用distinct的话就很麻烦了。想必聪明的你已经想到此时是row_number()登场的时候了吧。我们只需执行这样一句话就万事大吉了select * from (select row_number() over(partition by name order by id) as rowid,* from dbo.userinfo) x where x.rowid=1;虽然看起来有点长,但是很容易理解。现在执行的结果如下图:
现在名字重复的数据只取了一条,而且是根据sql语句中的order by id取的第一条,其中partition by后面跟的就是去重的字段,也许你想问为什么要加where x.rowid=1呢,现在我们不加这个条件看看结果如何:select * from (select row_number() over(partition by name order by id) as rowid,* from dbo.userinfo) x,如下图:
现在我们已经看到,如果不加条件会把所有数据都查出来,所以rowid=1的数据就是去重后的数据;
row_number()除了可以去重还可以得到表的行号,现在我们只需一下语句:select row_number() over(order by id) as rownum,* from dbo.userinfo,结果如下图:
得到了所有的数据,而且还得到了每条数据的行号,其中数据的顺序可以根据order by id调节,也就是说不去重的话就不用加partition by name了,此功能在分页中用的也比较多,假如每页15条数据,分页时直接加条件rownum between 1 and 15就行了。孤狼发表的博客很少,平时也比较懒,希望对大家有用。
上一篇: java实现的简单猜数字游戏代码