服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - SQL去重的3种实用方法总结

SQL去重的3种实用方法总结

2022-11-28 15:291024小神 Mysql

SQL去重是数据分析工作中比较常见的一个场景,下面这篇文章主要给大家介绍了关于SQL去重的3种实用方法的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下

SQL去重的三种方法汇总​ 

SQL去重的3种实用方法总结

这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项

1.distinct去重

注意的点:distinct

只能一列去重,当distinct后跟大于1个参数时,他们之间的关系是&&(逻辑与)关系,只有全部条件相同才会去重

弊端:当查询的字段比较多时,distinct会作用多个字段,导致去重条件增多

select distinct UserResult from Table1

SQL去重的3种实用方法总结

2.group by去重

去重原理:将重复的行进行分组,相同的数据只显示第一行

弊端:使用group by后,所有查询字段都需要使用聚合函数,比较繁琐

select min(UserName)UserName,min(UserSex)UserSex,min(UserSubject)UserSubject,min(UserResult)UserResult from Table1
group by UserResult

SQL去重的3种实用方法总结

3.row_number() over (parttion by 分组列 order by 排序列)

弊端:小孟还不知道

去重原理:现根据重复列进行分组,分组后再进行排序,不同的组序号为1,相同的组序号为2,排除为2的就达到了去重效果

select *from
(
--查询出重复行
select *,row_number() over (partition by UserResult order by UserResult desc)num from Table1
)A
where A.num=1

SQL去重的3种实用方法总结

这里安利第三个,row_number(),稳一些!

补充:SQL根据某列或几列分组去重——row_number() over(partition by)的用法

有时利用SQL进行数据处理会发现,要根据某列或某几列选取信息,由于其他列不同而出现了多次,如运行程序1的结果图1:

程序1:

--程序1:要解决的问题
select a.*
  from AShareEarningEst a
 where a.S_INFO_WINDCODE in ("000650.SZ")
   and a.REPORTING_PERIOD = 20181231
order by a.RESEARCH_INST_NAME,a.EST_DT

SQL去重的3种实用方法总结

我们看到,在AShareEarningEst(中国A股盈利预测明细)表中,共有12人次的证券公司研究员,对000650.SZ(仁和药业)公司的20181231报告期进行预测。例:华泰证券的杨烨辉在20160420、20160428和20160622分别对000650.SZ(仁和药业)发布研究报告进行了预测。现在,我们只需要同一家证券公司的同一个研究员(此处假定同一家证券公司的研究员姓名相同时,即为同一个研究员)做出的最新预测数据,即根据证券公司名称、研究员姓名,同时根据估计日期进行筛选。

此时,可根据row_number() over(partition by)进行处理,运行程序2结果如图2:

程序2:

--程序2:最终解决问题的程序
select b.*
from (select row_number() over(partition by a.RESEARCH_INST_NAME,
              a.ANALYST_NAME order by est_dt desc) as rn,
             --根据RESEARCH_INST_NAME(证券公司名称)和ANALYST_NAME(研究员名字)进行分类,
             --同时根据est_dt(估计日期)倒序排序,即最新日期排在同一分类的上方,此时构建出rn为
             a.*
        from wdzx.AShareEarningEst a
       where a.S_INFO_WINDCODE in ("000650.SZ") --, "000951.SZ", "600006.SH", "600166.SH")
         and a.REPORTING_PERIOD = 20181231) b --将分类后的程序构成表b。可以先运行b的程序观察结果
       where b.rn = 1--运用表b的结果进行子查询,rn=1即为所需结果

SQL去重的3种实用方法总结

此时,即主要利用了row_number() over(partition by)函数筛选出了去重后的结果。

总结

到此这篇关于SQL去重的3种实用方法的文章就介绍到这了,更多相关SQL去重内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/weixin_44786530/article/details/123069712

延伸 · 阅读

精彩推荐
  • MysqlMySQL主从同步原理及应用

    MySQL主从同步原理及应用

    日常工作中,MySQL数据库是必不可少的存储,其中读写分离基本是标配,而这背后需要MySQL开启主从同步,形成一主一从、或一主多从的架构。本篇文章我们...

    Java烘焙师5582021-11-21
  • Mysql简单了解mysql方言dialect

    简单了解mysql方言dialect

    这篇文章主要介绍了简单了解数据库方言dialect,数据库方言也是如此,MySQL 是一种方言,Oracle 也是一种方言,MSSQL 也是一种方言,他们之间在遵循 SQL 规范...

    FOOFISH-PYTHON之禅6582020-11-20
  • MysqlMySQL数据库Shell import_table数据导入

    MySQL数据库Shell import_table数据导入

    本文我们介绍一款高效的数据导入工具,MySQL Shell 工具集中的import_table,该工具的全称是Parallel Table Import Utility,需要的朋友请参考下文...

    ZhenXing_Yu9062021-09-26
  • MysqlMySQL 5.7.18 release版安装指南(含有bin文件版本)

    MySQL 5.7.18 release版安装指南(含有bin文件版本)

    这篇文章主要介绍了MySQL 5.7.18 release版安装指南,本文只谈论release版,即含有bin文件版本,需要的朋友可以参考下...

    Gizing7882020-07-26
  • Mysqlcentos6.5中rpm包安装mysql5.7初始化出错的解决方法

    centos6.5中rpm包安装mysql5.7初始化出错的解决方法

    这篇文章主要介绍了centos6.5中rpm包安装mysql5.7初始化出错的解决方法,需要的朋友可以参考下...

    三国梦回2342020-08-13
  • Mysql简单、易用的MySQL官方压力测试工具

    简单、易用的MySQL官方压力测试工具

    mysqlslap为mysql性能优化前后提供了直观的验证依据,系统运维和DBA人员应该掌握一些常见的压力测试工具,才能准确的掌握线上数据库支撑的用户流量上限及其...

    民工哥技术之路4992020-12-03
  • MysqlMySQL查询冗余索引和未使用过的索引操作

    MySQL查询冗余索引和未使用过的索引操作

    这篇文章主要介绍了MySQL查询冗余索引和未使用过的索引操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    遗失的曾经!5612021-05-03
  • MysqlServermanager启动连接数据库错误如何解决

    Servermanager启动连接数据库错误如何解决

    这篇文章主要介绍了Servermanager启动连接数据库错误如何解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    yaominghui8742021-02-24