响应式网站开发软件,网站备案到公司名称,wordpress 菜单颜色,江苏省建设厅的官方网站工作中使用SQL对数据进行处理计算时可能会遇到这样的问题#xff1b;读取的表数据会有重复#xff0c;或者我们关注的几个字段的数据会有重复#xff0c;直接使用原表数据会引起计算结果不准或者做表连接时产生笛卡尔积。 本文记录使用SQL进行数据去重的几种算法。
distinc…工作中使用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 rk1;