Mysql:sql去重的几种方式(大数据hive也可参考)
创始人
2024-03-03 07:09:57

文章目录

  • 前言
  • 准备
    • 创建表
    • 测试数据
    • 目标
  • 探索
    • distinct 去重
    • group by 去重
  • 实现方案
    • 方案一
    • 方案二
    • 方案三

前言

    我们做数据分析的时候经常会遇到去重问题,下面总结 sql 去重的几种方式,后续如果还有再补充,大数据分析层面包括 hive、clickhouse 也可参考。

准备

    本文以 mysql 作为作为例子进行 sql 去重的实现。首先准备一张表:

创建表

t_score

create table t_score(
ts datetime,
id varchar(10),
name varchar(255),
score int(3)
)

datetime: 入库时间
id :学号
name:姓名
soce :分数

测试数据

insert into t_score value(now(), '101','zhangsan', 90);
insert into t_score value(now(), '101','zhangsan', 92);
insert into t_score value(now(), '101','zhangsan', 96);
insert into t_score value(now(), '102','lisi', 90);
insert into t_score value(now(), '102','lisi', 92);
insert into t_score value(now(), '103','wangwu', 96);

目标

    最终目标是根据时间去重,将入库时间最新的数据留下,id 重复的认为是重复数据
原始数据
最终期望得到的结果为:
期望结果

探索

distinct 去重

首先想到的就是 distinct 关键字去重,先要了解一下这个关键字的含义和用法。

含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段。

用法注意
1.distinct【查询字段】,必须放在要查询字段的开头,即放在第一个参数;
2.只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用;
3.DISTINCT 表示对后面的所有参数的拼接取不重复的记录,即查出的参数拼接每行记录都是唯一的
4.不能与all同时使用,默认情况下,查询时返回的就是所有的结果。

使用 distinct 不能满足我们的去重需求:

SELECT DISTINCT( id ),NAME,score 
FROMt_score

测试1

group by 去重

group by 是分组去重,但是仅仅使用group by 也达不到去重求最新的目的

SELECTid,name,score 
FROMt_score 
GROUP BYid,name,score

图2

实现方案

方案一

首先,取出来每行数据的最大时间(即最新时间),然后让原表数据和最大时间做右连接,得到的就是最新的数据。

SELECTa0.*
FROMt_score a0RIGHT JOIN (SELECTmax(ts) tsMax,idFROMt_scoreGROUP BYid) b0 ON a0.ts = b0.tsMaxAND a0.id = b0.id

图3

方案二

方案二为方案一的变种,使用了exists 关键字来获取时间上最新的数据

SELECTa0.*
FROMt_score a0
WHEREEXISTS (SELECT*FROM(SELECTmax(ts) tsMax,idFROMt_scoreGROUP BYid) b0WHEREb0.tsMax = a0.tsAND b0.id = a0.id)

方案三

使用 row_number() over (parttion by 分组列 order by 排序列) 方式

SELECT* 
FROM( SELECT *, row_number() over ( PARTITION BY id ORDER BY ts DESC ) num FROM t_score ) a0 
WHEREa0.num = 1

需要注意的是:MySQL从8.0开始支持窗口函数

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...