Mysql:sql去重的几种方式(大数据hive也可参考)

news2024/11/25 22:43:40

文章目录

  • 前言
  • 准备
    • 创建表
    • 测试数据
    • 目标
  • 探索
    • 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 
FROM
	t_score

测试1

group by 去重

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

SELECT
	id,
	name,
	score 
FROM
	t_score 
GROUP BY
	id,
	name,
	score

图2

实现方案

方案一

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

SELECT
  a0.*
FROM
  t_score a0
  RIGHT JOIN (
    SELECT
      max(ts) tsMax,
      id
    FROM
      t_score
    GROUP BY
      id
  ) b0 ON a0.ts = b0.tsMax
  AND a0.id = b0.id

图3

方案二

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

SELECT
  a0.*
FROM
  t_score a0
WHERE
  EXISTS (
    SELECT
      *
    FROM
      (
        SELECT
          max(ts) tsMax,
          id
        FROM
          t_score
        GROUP BY
          id
      ) b0
    WHERE
      b0.tsMax = a0.ts
      AND 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 
WHERE
	a0.num = 1

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TStor OneCOS 技术专栏——轻松单桶万亿

TStor OneCOS简介 TStor OneCOS海量对象存储(后面简称OneCOS),是基于腾讯云公有云存储架构打造的完全自研的分布式软件定义存储,轻松支持单桶万亿对象和EB级容量,集群容量无限伸缩,同时支持高密大盘等多种…

【个人记录 | UNet | 整理ing】

【代码】 麋鹿 读后感: V1讲框架流程、V2V3狠真实,日常各种报错|预处理|size|格式|维度;“又出错了 狠棒狠棒 T T” 看V1脑袋有个框架,后面两个有较多设计预处理等报错.注意num_classes和weight_path V1(视频教程)、…

标记二肽Dansyl-Ala-Arg、87687-46-5

二肽Dansyl-Ala-Arg 编号:200087 CAS号:87687-46-5 三字母:Dansyl-Ala-Arg-COOH 描 述:羧肽酶 M 的荧光底物。由于底物和裂解产物 Dansyl-Ala-OH 具有同等荧光(λex 340 nm;λem 495 nm)&…

PyQt5安装详细教程

先展示一下安装好后的效果如下: 一、安装PyQt5 1、通过使用豆瓣镜像在命令提示符 (WINR)里输入cmd打开窗口进行安装: 点击确定后 输入pip install PyQt5 -i https://pypi.douban.com/simple,等待安装 当下载界面出现Successfully&#xff08…

[附源码]计算机毕业设计springboot良辰之境影视评鉴系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

小红书数据分析工具 | 新中式内容营销怎么做?

一句周杰伦的“国风就是最diao的”,让许多博主纵身涌入一片创作之海,吹起了暗藏在每一个中国人民心底的中国之风。新中式作为一直新锐队伍,发展潜力仍然很大,由于新中式风格所喜爱的人群是特定的,新中式服饰如何在小红…

吉时利2600A系列/2611A数字源表

2600A系列数字源表 吉时利最新的I-V源-测量仪器,既可以用作桌面级I-V特性分析工具,也可以成为多通道I-V测试系统的组 成部分。对于桌面级的应用,2600A系列提供一款嵌入式TSP Express测试软件,允许用户快速、方便地进行常 用的I-V测…

Kettle入门教程

目录 一、Kettle是什么 二、Kettle的两种设计 三、Kettle核心组件 四、安装与启动 五、使用 5.1 简单介绍 5.2 输入 5.3 输出 5.4 转换 5.5 脚本 一、Kettle是什么 Kettle最早是一个开源的ETL(Extract-Transform-Load,数据仓库技术&#xff09…

[附源码]计算机毕业设计springboot基于Web的软考题库平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

8、多进程之间的通信

多进程之间的常用通信方法有两种,及Queue和Pipe 一、Queue Queue([maxsize]):创建共享的进程队列。maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。底层队列使用管道和锁定实现。另外,还需要运行支持线程以便队列中…

Docker网络模式之bridge-尚文网络xUP楠哥

~~全文共1572字,阅读需约5分钟。 进Q群11372462,领取专属报名福利,包含云计算学习路线图代表性实战训练大厂云计算面试题资料! 当docker已经启动后,会生成一个名字叫做docker0的虚拟网桥,给到一个默认的IP地址为172.1…

Databend 开源周报 #69

Databend 是一款强大的云数仓。专为弹性和高效设计,自由且开源。 即刻体验云服务:https://app.databend.com。 New Features multiple catalog 实现删除用户定义目录 (#8820) meta 新增用于删除 key 和使 key 过期的 cli 命令 (#8858) planner 支…

30组易混易错词汇辨析,柯桥成人英语培训哪家好

30组易混易错词汇辨析 1. clothes, cloth, clothing clothes统指各种衣服,谓语动词永远是复数, cloth指布,为不可数名词 clothing 服装的总称,指一件衣服用a piece of, an article of 2. amount, number amount后接不可数名词…

求Huffman树的带权路径长度

Huffman树的建立过程: 首先得到整个叶子结点的集合: 求Huffman树的带权路径长度算法: 书上讲常见的求Huffman树的带权路径长度算法为:从叶子结点权值乘路径长度: WPL7*25*25*23*32*349 另外一种求WPL的算法为&…

视频编解码学习之一:理论基础

1. 为什么要进行视频压缩? 未经压缩的数字视频的数据量巨大 存储困难 一张DVD只能存储几秒钟的未压缩数字视频。 传输困难 1兆的带宽传输一秒的数字电视视频需要大约4分钟。 \2. 为什么可以压缩 去除冗余信息 空间冗余:图像相邻像素之间有较强的相关性…

化工厂人员定位系统:以安全为出发点,助力企业安全生产管控数智化

化工厂人员定位系统采用先进的高精度时间同步技术和调度技术,可在复杂化工场景中精准锁定作业人员在多层空间内的实时位置,实现高精度人员定位。 如何管理好每个车间的作业人员? 如何监管作业人员是否按时到岗? 如何知晓当前人员…

阿里专家精心整理分享的Java程序员面试笔试通关宝典PDF

前言 学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。 学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生…

MuLogin的WebRTC功能介绍与设置

WebRTC 协议可以绕过代理取到一些本机的网卡IP和真实的上网公网IP地址,那么我们可以使用替换模式来让网站取到我们指定的IP信息,或用禁用模式,让被访问的网站不能通过WebRTC协议来取我们的IP地址。这里如果你不知道公网IP是多少,建…

18.JVM

目录 1.编写源代码 2.JDK (Java Development Kit) 3.JRE(Java Runtime Environment) Java运行时环境 4.JVM 1.类名 2.类文件放在哪? 13JVM按需加载类,那么何时加载一个类? 4.类文件是怎么来的? 5…

WebRTC学习笔记五 SDP(Session Description Protocol)

SDP里面内容虽然很多,但是条理很清楚。SDP值为字符串,通过换行符生成一行一行的SDP报文,所有行可分为三类:全局行、音频行、视频行 v - Version,版本,版本,应等于0 o - Origin,源&a…