mysql 去重 rownumber_浅谈sql数据库去重

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

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

假如有张UserInfo表,如下图:

b337aedf5df15506a8aa9aa135b17f5a.png

现在我们要去掉完全重复的数据:SELECT DISTINCT * FROM dbo.UserInfo结果如下图:

663f954d5a9ba2d2cc1399559f89714b.png

但是现在有个新的需求,要把名字为‘张三'的去重,也就是相同名字的只要一条数据,要是还用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;虽然看起来有点长,但是很容易理解。现在执行的结果如下图:

27b9da7662516e88e10d58a10c116298.png

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

6250c6c203ad1b50c01d3daa761cccc2.png

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

ROW_NUMBER()除了可以去重还可以得到表的行号,现在我们只需一下语句:SELECT ROW_NUMBER() OVER(ORDER BY ID) AS RowNum,* FROM dbo.UserInfo,结果如下图:

b8ffe52e504d0923d181da248564a305.png

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

本文标题: 浅谈sql数据库去重

本文地址: http://www.cppcns.com/shujuku/mysql/111793.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,row_number()函数本身并不能实现去重的功能。row_number()函数是用来为查询结果集中的每一行分配一个唯一的行号,通常用于排序或分页查询中。如果要实现去重的功能,可以使用distinct关键字或者group by子句来实现。 使用distinct关键字可以对查询结果集进行去重。例如,使用以下语句可以去除结果集中的重复行: SELECT DISTINCT column1, column2, ... FROM table_name; 另一种方法是使用group by子句来分组并去重。例如,使用以下语句可以按照某一列进行分组并去重: SELECT column1, column2, ... FROM table_name GROUP BY column1; 需要根据具体的需求选择合适的方法来实现去重。希望能帮到您!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [mysql 数据去重的三种方式[实战]](https://blog.csdn.net/m0_55070913/article/details/126113153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Mysql学习SQL中distinct 和 row_number() over() 的区别及用法](https://blog.csdn.net/weixin_39751871/article/details/114784218)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值