欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈sql数据库去重

程序员文章站 2024-02-29 21:38:52
  关于sql去重,我简单谈一下自己的简介,如果各位有建议或有不明白的欢迎多多指出。   关于sql去重最常见的有两种方式:distinct和row_number()...

  关于sql去重,我简单谈一下自己的简介,如果各位有建议或有不明白的欢迎多多指出。

  关于sql去重最常见的有两种方式:distinct和row_number(),当然了row_number()除了去重还有很多其他比较重要的功能,一会我给大家简单说说我自己在实际中用到的。

  假如有张userinfo表,如下图:

 浅谈sql数据库去重
   
  现在我们要去掉完全重复的数据:select distinct * from dbo.userinfo结果如下图:

  浅谈sql数据库去重

  但是现在有个新的需求,要把名字为‘张三'的去重,也就是相同名字的只要一条数据,要是还用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数据库去重

  现在名字重复的数据只取了一条,而且是根据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,如下图:

  浅谈sql数据库去重

  现在我们已经看到,如果不加条件会把所有数据都查出来,所以rowid=1的数据就是去重后的数据;

  row_number()除了可以去重还可以得到表的行号,现在我们只需一下语句:select row_number() over(order by id) as rownum,* from dbo.userinfo,结果如下图:

  浅谈sql数据库去重

  得到了所有的数据,而且还得到了每条数据的行号,其中数据的顺序可以根据order by id调节,也就是说不去重的话就不用加partition by name了,此功能在分页中用的也比较多,假如每页15条数据,分页时直接加条件rownum between 1 and 15就行了。孤狼发表的博客很少,平时也比较懒,希望对大家有用。