服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - Mysql去重的几种方式分步讲解

Mysql去重的几种方式分步讲解

2022-12-07 15:18leo825... Mysql

SQL去重是数据分析工作中比较常见的一个场景,下面这篇文章主要给大家介绍了关于SQL去重的3种实用方法的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下

前言

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

准备

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

创建表

t_score

?
1
2
3
4
5
6
create table t_score(
ts datetime,
id varchar(10),
name varchar(255),
score int(3)
)

datetime: 入库时间

id :学号

name:姓名

soce :分数

测试数据

?
1
2
3
4
5
6
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 重复的认为是重复数据。

Mysql去重的几种方式分步讲解

最终期望得到的结果为:

Mysql去重的几种方式分步讲解

探索

distinct 去重

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

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

用法注意:

1.distinct【查询字段】,必须放在要查询字段的开头,即放在第一个参数;

2.只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用;

3.DISTINCT 表示对后面的所有参数的拼接取不重复的记录,即查出的参数拼接每行记录都是唯一的

4.不能与all同时使用,默认情况下,查询时返回的就是所有的结果。

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

?
1
2
3
4
5
6
SELECT DISTINCT
    ( id ),
    NAME,
    score
FROM
    t_score

Mysql去重的几种方式分步讲解

group by去重

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

?
1
2
3
4
5
6
7
8
9
10
SELECT
    id,
    name,
    score
FROM
    t_score
GROUP BY
    id,
    name,
    score

Mysql去重的几种方式分步讲解

实现方案

方案一

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

Mysql去重的几种方式分步讲解

方案二

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 排序列) 方式

?
1
2
3
4
5
6
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开始支持窗口函数

到此这篇关于Mysql去重的几种方式分步讲解的文章就介绍到这了,更多相关Mysql去重内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/u011047968/article/details/128112702

延伸 · 阅读

精彩推荐
  • Mysql关于Mysql自增id的这些你可能还不知道

    关于Mysql自增id的这些你可能还不知道

    这篇文章主要给大家介绍了关于Mysql自增id的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友...

    kun_jian5752020-09-24
  • MysqlMyISAM和InnoDB引擎优化分析

    MyISAM和InnoDB引擎优化分析

    这几天在学习mysql数据库的优化并在自己的服务器上进行设置,喻名堂主要学习了MyISAM和InnoDB两种引擎的优化方法,需要了解跟多的朋友可以参考下 ...

    MYSQL教程网5182019-12-12
  • Mysqlmysql 8.0.25 安装配置方法图文教程

    mysql 8.0.25 安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.25 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    王星伟QAQ7112021-08-30
  • Mysql安装mysql8.0.11及修改root密码、连接navicat for mysql的思路详解

    安装mysql8.0.11及修改root密码、连接navicat for mysql的思路详解

    这篇文章主要介绍了安装mysql8.0.11以及修改root密码、连接navicat for mysql,需要的朋友可以参考下...

    小牛同学_6472019-07-09
  • Mysqlmysql 操作总结 INSERT和REPLACE

    mysql 操作总结 INSERT和REPLACE

    用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句。 ...

    mysql教程网1902019-10-31
  • MysqlMySQL DEFINER具体使用详解

    MySQL DEFINER具体使用详解

    在 MySQL 数据库中,在创建视图及函数的时候,你有注意过 definer 选项吗?本篇文章主要介绍下 MySQL 中 definer 的含义及作用,感兴趣的可以了解一下...

    MySQL技术7092021-09-17
  • Mysqlmysql语句如何插入含单引号或反斜杠的值详解

    mysql语句如何插入含单引号或反斜杠的值详解

    这篇文章主要给大家介绍了关于mysql语句如何插入含单引号或反斜杠的值的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定...

    nemo5662019-06-05
  • Mysqlmysql日志触发器实现代码

    mysql日志触发器实现代码

    这篇文章主要介绍了mysql日志触发器实现代码,需要的朋友可以参考下...

    HelloWorld7042021-01-04