精华内容
下载资源
问答
  • MySQL删除重复数据保留最新一条

    千次阅读 2019-04-17 19:00:37
    按天删除表中重复数据只保留最新一条(这里按照id越大,数据越新),注意,一天中可能出现多条数据。重复数据以name为准,即name相同视为重复 案例表结构和数据 CREATE TABLE `test` ( `id` int(11) ...

    MySQL删除重复数据并保留最新的一条,网上有些博客写的有问题,因为他们只考虑到或者说他们的重复数据最多只有两条,当重复数据大于2时,就会出现问题。

    案例描述:
    按天删除表中重复数据只保留最新的一条(这里按照id越大,数据越新),注意,一天中可能出现多条数据。重复数据以name为准,即name相同视为重复

    案例表结构和数据

    CREATE TABLE `test` (
      `id` int(11) NOT NULL,
      `create_date` datetime NOT NULL,
      `name` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `test`.`test`(`id`, `create_date`, `name`) VALUES (1, '2019-04-17 00:00:01', '1');
    INSERT INTO `test`.`test`(`id`, `create_date`, `name`) VALUES (2, '2019-04-17 00:00:03', '1');
    INSERT INTO `test`.`test`(`id`, `create_date`, `name`) VALUES (3, '2019-04-17 00:00:06', '3');
    INSERT INTO `test`.`test`(`id`, `create_date`, `name`) VALUES (4, '2019-04-18 00:00:04', '2');
    INSERT INTO `test`.`test`(`id`, `create_date`, `name`) VALUES (5, '2019-04-17 00:00:01', '1');
    INSERT INTO `test`.`test`(`id`, `create_date`, `name`) VALUES (6, '2019-04-18 00:00:00', '2');
    INSERT INTO `test`.`test`(`id`, `create_date`, `name`) VALUES (7, '2019-04-18 00:00:03', '1');
    INSERT INTO `test`.`test`(`id`, `create_date`, `name`) VALUES (8, '2019-04-18 00:00:04', '1');
    

    在这里插入图片描述
    SQL

    DELETE FROM	test WHERE 
    id IN 
    (
    	SELECT a.id FROM test a WHERE a.NAME IN 
    	(
    		SELECT b.NAME FROM test b GROUP BY b.NAME, DATE_FORMAT( b.create_date, '%Y-%m-%d' ) HAVING count( DATE_FORMAT( b.create_date, '%Y-%m-%d' ) ) > 1 
    	) 
    ) 
    AND id NOT IN 
    (
    		SELECT max( d.id ) id FROM test d GROUP BY d.NAME, DATE_FORMAT( d.create_date, '%Y-%m-%d' ) HAVING count( DATE_FORMAT( d.create_date, '%Y-%m-%d' ) ) > 1 
    );
    

    分析
    根据案例描述,按天删除重复数据,以name相同视为重复,并且只保留最新的一条

    在这里插入图片描述

    1. 时间name分组,并通过having过滤每种重复的name数量大于1的name,注意:group by的第一个参数一定要是时间
    2. 以步骤1的结果集作为条件,查询表所有重复数据的id
    3. 同步骤1,但是查询的是重复数据的最大id
    4. 删除数据
    展开全文
  • mysql数据库删除重复的数据保留一条

    万次阅读 多人点赞 2019-07-09 22:15:13
    现在身份证号identity_id和姓名name有很多重复的数据,需要删除只保留一条有效数据。 2.模拟环境 1.等入mysql数据库,创建一个单独的测试数据库mysql_exercise create database mysql_exercise charset utf8; 2....

    1.问题引入

    假设一个场景,一张用户表,包含3个字段。id,identity_id,name。现在身份证号identity_id和姓名name有很多重复的数据,需要删除只保留一条有效数据。

    2.模拟环境

    • 1.登入mysql数据库,创建一个单独的测试数据库mysql_exercise
    create database mysql_exercise charset utf8;
    
    • 2.创建用户表users
    create table users(
    					id int auto_increment primary key,
    					identity_id varchar(20),
    					name varchar(20) not null
                       );
    

    在这里插入图片描述

    • 3.插入测试数据
    insert into users values(0,'620616199409206512','张三'),
    						(0,'620616199409206512','张三'),
    						(0,'62062619930920651X','李四'),
    						(0,'62062619930920651X','李四'),
    						(0,'620622199101206211','王五'),
    						(0,'620622199101206211','王五'),
    						(0,'322235199909116233','赵六');
    

    可以多执行几次,生成较多重复数据。
    在这里插入图片描述

    • 4.解决思路
      (1)根据身份证号和name进行分组;
      (2)取出分组后的最大id(或最小id);
      (3)删除除最大(或最小)id以外的其他字段;

    • 5.第一次尝试(失败!!!)

    delete from users where id not in (select max(id) from users group by identity_id,name);
    

    报错:

    1093 (HY000): You can't specify target table 'users' for update in FROM clause
    

    在这里插入图片描述
    因为在MYSQL里,不能先select一个表的记录,再按此条件进行更新和删除同一个表的记录。
    解决办法是,将select得到的结果,再通过中间表select一遍,这样就规避了错误,
    这个问题只出现于mysql,mssql和oracle不会出现此问题。

    所以我们可以先将括号里面的sql语句先拿出来,先查到最大(或最小)id。

    select max_id from (select max(id) as max_id from users group by identity_id,name);
    

    接着,又报错了!!!

    ERROR 1248 (42000): Every derived table must have its own alias
    

    意思是说:提示说每一个衍生出来的表,必须要有自己的别名!

    执行子查询的时候,外层查询会将内层的查询当做一张表来处理,所以我们需要给内层的查询加上别名
    在这里插入图片描述
    继续更正:
    给查询到的最大(或最小id)结果当做一张新的表,起别名t,并查询t.mix_id

    select t.max_id from (select max(id) as max_id from users group by identity_id,name) as t;
    

    可以成功查到最大(或最小)id了,如下图:
    在这里插入图片描述

    • 6.第二次尝试(成功!!!)
    delete from users where id not in (
    		select t.max_id from 
    		(select max(id) as max_id from users group by identity_id,name) as t
    		);
    

    执行结果:
    在这里插入图片描述
    成功将重复的数据删除,只保留了最后一次增加的记录。同理也可以保留第一次添加的记录(即删除每个分组里面除最小id以外的其他条记录)

    3.知识拓展一:更新数据

    其他场景应用:要将用户表user_info里名字(name)为空字符串("")的用户的状态(status)改成"0"

    update user_info set status='0' where user_id in (select user_id from user_info where name='')
    

    同样报了如下错误:

    You can’t specify target table ‘user_info’ for update in FROM clause

    因为在MYSQL里,不能先select一个表的记录,再按此条件进行更新和删除同一个表的记录,解决办法是,将select得到的结果,再通过中间表select一遍,这样就规避了错误。
    以下两种均可!!!

    update user_info set status='0' where user_id in 
    	 (select user_id from (select user_id from user_info where name = '') t1);
    

    下面这种也可,细微差别,别名可带as可不带,t1.user_id 直接和内层的user_id对应也可以。

    update user_info set status='0' where user_id in 
    	(select t1.user_id from (select user_id from user_info where name='') as t1);
    

    3.1 分步骤解析

    (1)将以下查询结果作为中间表:

    select user_id from user_info where name='';
    

    (2)再查询一遍中间表作为结果集:

    select user_id from (select user_id from user_info where name='') as t;
    

    (3)更新数据

    update user_info set status='0' where user_id in 
    	(select user_id from (select user_id from user_info where name='') as t1);
    

    4.拓展练习:删除重复数据

    编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

    +----+------------------+
    | Id | Email            |
    +----+------------------+
    | 1  | john@example.com |
    | 2  | bob@example.com  |
    | 3  | john@example.com |
    +----+------------------+
    

    Id 是这个表的主键。
    例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:

    +----+------------------+
    | Id | Email            |
    +----+------------------+
    | 1  | john@example.com |
    | 2  | bob@example.com  |
    +----+------------------+
    
    
    • 解答一:
    delete from Person where Id not in (
    	select t.min_id from (
    		select min(Id) as min_id from Person group by Email
    		) as t
    	);
    
    • 解答二:
    delete p1 from 
    	Person as p1,Person as p2 
    		where p1.Email=p2.Email and p1.Id > p2.Id;
    
    展开全文
  • spark的API中可以使用dropDuplicate()方法根据指定列...有时候我们需要保留文档中的最后一条数据,这时候我们可以将指定列作为key,将源数据转换为一个mapPartionsRDD,然后再reduceByKey进行去重保留最后加入的数。

    spark的API中可以使用dropDuplicate()方法根据指定列进行去重。

    Dataset<T> dropDuplicates()
    Returns a new Dataset that contains only the unique rows from this Dataset.
    Dataset<T> dropDuplicates(scala.collection.Seq<String> colNames)
    (Scala-specific) Returns a new Dataset with duplicate rows removed, considering only the subset of columns.
    Dataset<T> dropDuplicates(String[] colNames)
    Returns a new Dataset with duplicate rows removed, considering only the subset of columns.
    Dataset<T> dropDuplicates(String col1, scala.collection.Seq<String> cols)
    Returns a new  Dataset with duplicate rows removed, considering only the subset of columns.
    Dataset<T> dropDuplicates(String col1, String... cols)
    Returns a new  Dataset with duplicate rows removed, considering only the subset of columns.
    但是根据此方法去重后默认保留的第一条数。有时候我们需要保留文档中的最后一条数据,这时候我们可以将指定列作为key,将源数据转换为一个mapPartionsRDD,然后再reduceByKey进行去重保留最后加入的数。

    java版:

    final String[] keys = view.getPrimKeys();//获取主键
    
    JavaPairRDD<String, Row> reducePairRDD = viewRDD.toJavaRDD().mapToPair(
            new PairFunction<Row, String, Row>() {
    
                public Tuple2<String, Row> call(Row row) throws Exception {
                    String key = "";
                    for (int i = 0; i < keys.length; i++) {
                        key += row.getAs(keys[i]);
                    }
    
                    return new Tuple2<String, Row>(key, row);
                }
            }
    ).reduceByKey(new Function2<Row, Row, Row>() {
        public Row call(Row row, Row row2) throws Exception {
            return row2;
        }
    }).values;

    scala版:

    val unRdd = ds.rdd.map(line=>((line.getAs[String]("col1")+line.getAs[String]("col2")),line)).reduceByKey((x,y)=>y,6).map(_._2)
    在对Dataset转换成mapPartitionsRDD时也可以使用keyBy()。

    keyBy()
    public static <U> JavaPairRDD<U,T> keyBy(Function<T,U> f)
    对于keyBy()和mapToPair()两个方法的本质并没有区别。

    //mapToPair实现源码
    def mapToPair[K2, V2](f: PairFunction[T, K2, V2]): JavaPairRDD[K2, V2] = {
      def cm: ClassTag[(K2, V2)] = implicitly[ClassTag[(K2, V2)]]
      new JavaPairRDD(rdd.map[(K2, V2)](f)(cm))(fakeClassTag[K2], fakeClassTag[V2])
    }
    //keyBy()实现源码
    def keyBy[U](f: JFunction[T, U]): JavaPairRDD[U, T] = {
      implicit val ctag: ClassTag[U] = fakeClassTag
      JavaPairRDD.fromRDD(rdd.keyBy(f))
    }
    //它会调用下面的keyBy方法
    def keyBy[K](f: T => K): RDD[(K, T)] = withScope {
        val cleanedF = sc.clean(f)
        map(x => (cleanedF(x), x))
    }
    两个方法都是使用rdd.map方法来生成新的RDD。


    展开全文
  • 今天碰到一个题,假如有一个person表,有id,和name两个字段,如果要删除存在name相同的字段的数据,并保留最新一条,sql怎么设计?


    今天碰到一个题,假如有一个person表,有id,和name两个字段,如果要删除存在name相同的字段的数据,并保留最新一条,sql怎么设计?

    原本的设计如下,但是运行出错

    DELETE FROM person
    WHERE (pname IN
      (SELECT pname
      FROM person
      GROUP BY pname
      HAVING COUNT(pname) > 1)) AND (id NOT IN
      (SELECT MIN(id)
      FROM person
      GROUP BY pname
      HAVING COUNT(pname) > 1));

    错误原因:You can't specify target table for update in FROM clause

    翻译过来的意思是:不能先select出同一表中的某些值,再update这个表(在同一语句中).

    正确的写法是:

    DELETE
    FROM
      person
    WHERE
      (
        pname IN (
          SELECT
            n. pname
          FROM
            (
              SELECT
                pname
              FROM
                person
              GROUP BY
                pname
              HAVING
                COUNT(pname) > 1
            ) n
        )
      )
    AND (
      id NOT IN (
        SELECT
          i.id
        FROM
          (
            SELECT
              MIN(id) AS id
            FROM
              person
            GROUP BY
              pname
            HAVING
              COUNT(pname) > 1
          ) i
      )
    );


    展开全文
  • MySQL中查询所有数据,其中重复的数据中只保留最新的一条,其余的过滤今天遇到的问题,数据库的数据中的某个条码号可能存在着不同时间的多条数据,但是业务只想查询全部数据,并且单个条码号的最新一条数据 ...
  • mysql根据多字段删除重复的数据’ DELETE FROM 表名 WHERE ...这样我们就根据多字段删除重复的数据了,但是没有保留一条数据 DELETE FROM 表名 WHERE (字段1,字段2,字段3) IN (SELECT 字段1,字段2,字段3 FROM (S.
  • 求一个方法 或者 直接一条SQL 能直接删掉 T 这个字段相同的的数据保留一条 变成 1 我是谁 XXXX 3 你是谁 XXXXX 5 我在 XXXX 有简单的方法吗 额 效率不需要追求那么好。。反正服务器里面挂着。。。不...
  • 数据库SQL去重,保留一条数据

    万次阅读 2017-06-15 22:17:09
    利用SQL,删除掉重复多余的数据,并且只保留一条数据。 1、查找表中多余的重复记录,重复记录是根据单个字段(teamId)来判断 select * from team where teamId in (select teamId from team group by ...
  • 比如我的数据如下图所示,查询目的是查询出main重复的,并且保留main分组中score最大的一条数据,也参考了很多答案但是并不理想,后来在技术群里请教了一位大神 最后的sql贴出来: select id, main, score ...
  • 正好想写一条删除重复语句并保留一条数据的SQL,网上查了一部分资料写的很详细,但还是在这里写下自己的理解,以遍后续学习 。如下: 表字段和数据:  SQL语句:  DELETE FROM `user` WHERE id NOT IN...
  •  重复数据删除技术可以提供更大的备份容量,实现更长时间的数据保留,还能实现备份数据的持续验证,提高数据恢复服务水平,方便实现数据容灾等。 重复的数据可能有这样两种情况,第种时表中只有某些字段一样,第...
  • 数据库操作中,经常会因为导数据造成数据重复,需要进行数据清理,去掉冗余的数据,只保留正确的数据一:重复数据根据单个字段进行判断1、首先,查询表中多余的数据,由关键字段(name)来查询。select * from 表 ...
  • SQL删除重复数据保留一条

    万次阅读 多人点赞 2011-05-09 18:39:00
    SQL删除重复数据保留一条
  • 删除数据,并保留一条,保留的是伪列rowid最小的一条数据,如果有其他的需求,可以稍微自己改一改就可以保留自己要想的数据 。 delete from table_name a where a.name in (select name from table_name group by ...
  • **#例1:根据手机号customer_id查询所有重复的数据** SELECT * FROM aad_apply_main WHERE customer_id IN ( SELECT customer_id FROM aad_apply_main GROUP BY ...
  • 偶尔遇到一张表里重复插入了了相同的数据,为了防止重复的数据,我们需要对历史数据进行清理(保留最新一条),并且为字段加入唯一键。下面以pt_logistics_check(包裹验收表)为例,packageNo为包裹号,checkId为...
  • Mysql删除重复数据保留一条,我的sql这样的 DELETE from t_patient WHERE pa_iid IN (select pa_iid from t_patient group by pa_vname having count(pa_vname)>1) 但是报错了: [Err] 1093 - You can't specify ...
  • 假设种情况,数据库的数据重复了,但是又不想随便去除个。 比如,书库中《三体》录入了多次,想根据时间戳,只保留次入库的记录,也就是张三录入的记录。 分析 想要删除重复数据,需要找出不合适的数据,...
  • mysql去除重复数据,只保留一条

    千次阅读 2017-12-07 14:48:15
    之前写过的爬虫里面,因为种种原因出现了一些重复的...删除ppeople 重复的数据,然后重复数据中保留id最小的那一条数据。 delete from people  where peopleId in (select peopleId from people group by peopleId
  • 、XXX的基本概念 term 索引词,在elasticsearch中索引词(term)是个能够被索引的精确值。foo,Foo Foo几个单词是不相同的索引词。索引词(term)是可以通过term查询进行准确的搜索。 二、XXX的详细说明 加粗文本 ...
  • Oracle删除冗余数据,只保留一条

    千次阅读 2017-05-26 16:39:43
    今天去面试,面试官提了一个问题,删除oracle中的冗余数据,只保留id最小的一条。当时没有想明白,回来认真想了一下,总算有了点思路,现将sql贴出来,欢迎大家批评指正。 假设有这样一个表city表,表中有两个字段,...
  • mysql删除重复数据,并保留一条

    千次阅读 2018-01-18 15:29:27
    因为系统bug在对所在店铺的会员进行屏蔽的时候没有进行查重操作,导致在屏蔽表中出现了重复的数据,所以需要删除此表中姓名重复的数据,并保留其中的一条。模拟数据如下图: 第一条sql : delete from t_black_...
  • oracle删除重复数据保留一条

    千次阅读 2018-07-30 22:15:12
    1.删除单个字段,如下例子即为删除学号相同的学生数据,即每个学号记录一条学生数据 delete from stu t1 where t1.rowid not in ( select min(t2.rowid) from stu t2 ...
  • 1.停服情况下,原表(备份),建一张临时表,将原表的唯一数据拷贝到临时表中,删除源表,更改临时表表名 2.非停服情况下去重,新建一张临时表 insert into temp () values (select distinct * from source) delete ...
  • 之前博客mysql数据库中删除重复的数据保留一条中介绍的方法适用于有两条重复的数据 然后删除其中一条,保留一条,如果重复的数据较多(>2)时 就需要执行多次,重复的数据有3条 对应执行两次 依次类推,很显然...
  • 这里记录一下用到的语句和语句...-- 查询出重复的数据 SELECT COUNT(*) as repeats, address, signer_name, signer_mobile FROM user_operation_useraddress GROUP BY address, signer_name, signer_mobile H...
  • MySQL中删除重复数据保留一条

    万次阅读 2018-09-20 18:14:45
    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢  1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 SELECT * FROM people WHERE ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 433,956
精华内容 173,582
关键字:

保留最新的一条数据