SQL对数据进行去重

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

本文记录使用SQL进行数据去重的几种算法。

distinct关键字去重

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

sql 复制代码
-- 单列去重
select 
	distinct field_a 
from 
	tableName;
-- 多列去重
select 
	distinct field_a,field_b,.. 
from 
	tableName;
group by分组去重

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

sql 复制代码
-- 分组去重实现
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()里定义分组和排序,但是会对其中的每一行记录进行函数计算返回结果,其结果是没有减少原表行数但是也达到了分组排序等计算结果。

sql 复制代码
-- 窗口函数去重实现
-- 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
from
	tableName
)

select
	field_a,
	field_b
from
	tmp_table
where rk=1;
相关推荐
月空MoonSky21 分钟前
Oracle中TRUNC()函数详解
数据库·sql·oracle
momo小菜pa21 分钟前
【MySQL 06】表的增删查改
数据库·mysql
向上的车轮1 小时前
Django学习笔记二:数据库操作详解
数据库·django
编程老船长1 小时前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
Mephisto.java1 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
全栈师2 小时前
SQL Server中关于个性化需求批量删除表的做法
数据库·oracle
Data 3172 小时前
Hive数仓操作(十七)
大数据·数据库·数据仓库·hive·hadoop
BergerLee3 小时前
对不经常变动的数据集合添加Redis缓存
数据库·redis·缓存
程序员大金3 小时前
基于SpringBoot+Vue+MySQL的装修公司管理系统
vue.js·spring boot·mysql
gorgor在码农3 小时前
Mysql 索引底层数据结构和算法
数据结构·数据库·mysql