u011856283
你好杰米
2018-03-19 08:39
采纳率: 95%
浏览 2.2k
已采纳

【数据库】我需要一个查重效率高的方法

本人用的hive,可以理解为关系型数据库,现在的需求是,有一塔数据,数据中都有手机号,我需要看看这一沓数据中有哪些是数据里已经有了的。

目前我的做法是,先取一条,然后按照手机号遍历整张表,然后下一条,遍历,下一条,遍历。。。。。。

我觉得此法即使加了索引效率也很低,求一个效率高的sql,或者思路

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

10条回答 默认 最新

  • baidu_37252709
    lPsycongroo 2018-03-21 08:26
    已采纳

    用分组查询不行吗,根据手机号码分组,总数大于1的就是有重复的

    点赞 评论
  • Boover
    Boover 2018-03-19 08:50

    你可以把数据库中的所有手机号读出来,存到一个java集合数据结构中;再使用另外的一个集合数据结构存储手中的数据。
    两个集合求交,就得到在数据库中的数据。求差就得到不在数据库中的数据。
    这种方法只用读一次数据库。

    点赞 评论
  • l935206164
    fate丶lee 2018-03-19 08:52

    你分组统计,然后再判断你统计大于1的数据。

    点赞 评论
  • l935206164
    fate丶lee 2018-03-19 09:02

    我mysql SELECT * FROM (SELECT CASE WHEN COUNT(*)>1 THEN age END as number FROM user u GROUP BY u.age) t where t.number is NOT NULL

    点赞 评论
  • Ocean_kyle
    Ocean_kyle 2018-03-19 09:11

    用distinct应该可以了,SELECT DISTINCT 列名称 FROM 表名称

    点赞 评论
  • cxfidc01
    红帽01 2018-03-19 09:58

    不懂hive

    从数据库角度来考虑的话
    SELECT phone ,
    COUNT(*)
    FROM ( SELECT phone
    FROM t1
    UNION ALL
    SELECT phone
    FROM t2
    UNION ALL
    SELECT phone
    FROM t3
    ) a
    GROUP BY phone
    HAVING COUNT(*) > 1

    从程序角度来考虑
    添加一个hashtable,key为手机号码,value为重复次数。
    循环所有你的表的手机号码,
    如果手机号码不存在,添加进入hashtable
    如果手机号码存在,把hashtable表对应的数量+1。
    最后再循环hashtable,数量大于1的数据就是你需要的。

    点赞 评论
  • lixiaozhen007
    lixiaozhen007 2018-03-19 16:00

    我记得一个算法,好像取数据集合(排序的),因为,手机号都是数字,按照数字的处理方式处理,直接比较数组下标也是可以的;重复的数据打印,并remove

    点赞 评论
  • u011944141
    majinbo111 2018-03-20 02:47

    把“一塔数据”里的手机号码另外做一个映射, 存放的方式可以是内存中,缓存服务器,数据库。第一次建立映射可能需要一点时间,之后有更新维护即可,查询的时候都是毫秒级别的。
    比如说:存储结构 【手机号】=》 【计数】, 查询计数大于1的 就是想要查询的结果

    点赞 评论
  • PNtifa
    PNtifa 2018-03-20 08:14

    select * from table t where t.phone in (select t.phone from table t group by t.phone having count(*)>1)

    点赞 评论
  • Vipfgyy
    libayi 2018-03-22 02:15

    这个不就是手机号码的woordcount吗?

    点赞 评论

相关推荐