一、背景。
最近在和系统模块做数据联调,其中有一个需求是将两个角色下的相关数据对比后将最新的数据返回出去,于是就想到了去重,再次做一个总结。
二、数据去重三种方法使用。
1.通过mysql distinct:去重(过滤重复数据)
1.1.在使用 mysql select 语句查询数据的时候返回的是所有匹配的行。
select t.age from t_user t
可以看到查询结果返回了 10 条记录,其中有一些重复的 age 值,有时出于对数据分析的要求,需要消除重复的记录值。
1.2.distinct 关键字指示 mysql 消除重复的记录值。
语法格式为:
select distinct <字段名> from <表名>;
select distinct t.age from t_user t
由运行结果可以看到,这次查询结果只返回了 5 条记录的 age 值,且没有重复的值。
ps:
其中,“字段名”为需要消除重复记录的字段名称,多个字段时用逗号隔开。
使用 distinct 关键字时需要注意以下几点:
-
distinct 关键字只能在 select 语句中使用。
-
在对一个或多个字段去重时,distinct 关键字必须在所有字段的最前面。
-
如果 distinct 关键字后有多个字段,则会对多个字段进行组合去重,也就是说,只有多个字段组合起来完全是一样的情况下才会被去重。
2.group by
select t.age from t_user t group by t.age;
3.row_number窗口函数。
语法格式为:
row_number() over (partition by <用于分组的字段名> order by <用于组内排序的字段名>)
项目使用的去重:
select * from (select t.*,row_number() over(partition by t.children_id order by t.update_time desc) rn
from mdm_data_authority_view_info t where t.data_class_id = '分类id' and t.data_role_id
in ( '角色id', '角色id' ))
where rn = 1;