当前位置: 首页 > news >正文

SQL对数据进行去重

工作中使用SQL对数据进行处理计算时可能会遇到这样的问题;读取的表数据会有重复,或者我们关注的几个字段的数据会有重复,直接使用原表数据会引起计算结果不准或者做表连接时产生笛卡尔积。
本文记录使用SQL进行数据去重的几种算法。

distinct关键字去重

distinct关键字加在对应字段前可以实现对改字段结果的去重查询,distinct同样可以加在多个字段前实现按照多个字段结果的去重。

-- 单列去重
select distinct field_a 
from tableName;
-- 多列去重
select distinct field_a,field_b,.. 
from tableName;
group by分组去重

使用group by方法进行去重的原理很简单:按照某个或几个字段进行分组,那么每一组(分组字段取值相同)只会保留一条记录,甚至可以在select分组字段后面使用聚合函数产生每组的一个聚合结果。

-- 分组去重实现
select field_a,field_b,field_c 
from tableName 
group by field_a,field_b,field_c;
-- 分组去重后加几列聚合字段
select field_a,field_b,field_c,count(*),count(distinct field_d),sum(field_e) 
from tableName 
group by field_a,field_b,field_c;
窗口函数去重

窗口函数与聚合函数类似,聚合函数作用于分组后,对每组产生一个计算结果,窗口函数在OVER()里定义分组和排序,但是会对其中的每一行记录进行函数计算返回结果,其结果是没有减少原表行数但是也达到了分组排序等计算结果。

-- 窗口函数去重实现
-- row_number()对每组原来n行数据产生1-n对应的排序rk,即使有重复值rk会累加,也不会重复,适合用来去重
with tmp_table as(
select*,row_number() over(partition by field_a,field_b order by field_c) as rk
fromtableName
)selectfield_a,field_b
fromtmp_table
where rk=1;

相关文章:

  • Java自学第8课:电商项目(3) - 重新搭建环境
  • Linux实战一天一个小指令--《日志查看》
  • 设备报修流程要怎么优化?工单管理系统如何提高设备维修效率?
  • 云原生服务高可用性保持的简单思考
  • Linux 网络管理
  • 探秘美国服务器价格因素:成本、竞争力还是资源优势?
  • docker通过nginx代理tomcat-域名重定向
  • 使用JS 判断数组对象 里面的每一个字段,字段为空,就返回true, 所有字段不为空,返回 false
  • 【广州华锐互动】地震防灾减灾科普3D虚拟展厅:向公众普及地震安全知识
  • vue+react封装请求
  • 【Bug】当用opencv库的imread()函数读取图像,用matplotlib库的plt.imshow()函数显示图像时,图像色彩出现偏差问题的解决方法
  • JS 获取本周一,本周日,上周一,上周日,下周一,下周日,本月第一天,本月最后一天,上月第一天,上月最后一天,下月第一天,下月最后一天
  • 企业传统纸质设备维修方式的痛点以及解决方案
  • 【Redis】list列表
  • Linux 系统概述
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android 架构优化~MVP 架构改造
  • Java 最常见的 200+ 面试题:面试必备
  • Meteor的表单提交:Form
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Swift 中的尾递归和蹦床
  • Unix命令
  • 创建一种深思熟虑的文化
  • 06-01 点餐小程序前台界面搭建
  • ​一些不规范的GTID使用场景
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (003)SlickEdit Unity的补全
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2)STM32单片机上位机
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (二)丶RabbitMQ的六大核心
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (六)软件测试分工
  • (一)插入排序
  • (一)基于IDEA的JAVA基础12
  • ../depcomp: line 571: exec: g++: not found
  • .net Application的目录
  • .Net 中Partitioner static与dynamic的性能对比
  • .Net7 环境安装配置
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .net实现客户区延伸至至非客户区
  • /var/lib/dpkg/lock 锁定问题
  • @31省区市高考时间表来了,祝考试成功
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [C]编译和预处理详解
  • [C++]AVL树怎么转
  • [docker] Docker容器服务更新与发现之consul
  • [leetcode] Balanced Binary Tree