快速实现大量数据匹配来电号码归属

问题分析

手机号码又主要分两种,018179700104和18179700104,即带0开头和不带0开头的。

邮编又分两种三位数的邮编和四位的邮编,如北京010,深圳0755.

结果一个来电号码要判断是否满足四种情况中的一种。Left join的haul就会产生巨大的数据量匹配,导致非常的缓慢。

:由于数据库数据量大,且来电归属地的表数据量庞大,还需要同时匹配手机号码和邮编。

首先我们来看一下,号码归属地的表

 

以上三列分别是判断归属地的手机号码,区号和对应的城市。为了实现同时匹配邮编和电话号码。我们需要将邮编和手机号码,合并成一列,并将对应的城市生成一列。

Postgresql的语句如下:

SELECT DISTINCT  phone,city from rd_attribution UNION ALL  SELECT DISTINCT city_code,city from rd_attribution

我们发现执行这条sql语句非常慢,需要6秒左右,如果我们用大量数据去和这个临时表left就会造成sql语句执行非常非常的缓慢。

所以我们可以创建一张表,专门用于存储这两个字段。这样我们就可以大大加快sql执行速度。

假设表名为city1

Sql语句如下:insert into city1(phone,city)  SELECT DISTINCT  phone,city from rd_attribution UNION ALL  SELECT DISTINCT city_code,city from rd_attribution

生成表如下:

接下来我们就考虑,如何实现连接这张表时字段一一对应,而不是判断一个字段可能满足手机号码,邮编其中的一种情况。

首先我们知道手机号码是11位数据,且是1开头。

当前面加0时,就是12位。

如果是座机的话,现在扩容后是8位。

如果区号是三位数,如010,加上八位座机号码,便是11位

如果区号是4位数,如0755,加上八位座机号码,便是12位

以上便有四种情况

 

电话号码长度

分析数据

 

0开头

 

11位

座机,且邮编3位

substr(n.calling_pty,1,3)

12位

1开头

手机号码

substr(n.calling_pty,2,7)

非1开头

座机,4位邮编

substr(n.calling_pty,1,4)

1开头

11位

正常手机号码

substr(n.calling_pty,1,3)

以上判断是为了让我们截取来电号码,去跟归属地表中的数据去判断,归属地。

我们在数据库中用case when来实现。以下是完整的查询归属地的语句。

select DISTINCT sd.*,s.city from  (
select DISTINCT t.num1,n.calling_pty,

      case when substr(n.calling_pty,1,1)='1' and length(n.calling_pty)=11 then substr(n.calling_pty,1,7)

      when substr(n.calling_pty,1,1)='0' and length(n.calling_pty)=11 then  substr(n.calling_pty,1,3)

            when substr(n.calling_pty,1,2)='01' and length(n.calling_pty)=12 then substr(n.calling_pty,2,7)

            when substr(n.calling_pty,1,1)='0' and length(n.calling_pty)=12 and substr(n.calling_pty,2,1)!='1'     then substr(n.calling_pty,1,4)

             else 'null'

            end  phones

from call_rec t left join call_rec n on t.callid=n.callid

where

t.num1>'2017-11-01 00:00:00'

and length(n.calling_pty)>7

)  sd

left join city1 s

on sd.phones=s.phone

至此完美实现可快速匹配归属地。重点在对来电号码进行分析,处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大量数据匹配是指在一个包含大量数据数据库或数据集中,通过某种方式找到并匹配特定数据的过程。在VBA中,我们可以使用多种方法来实现大量数据匹配快速处理。 首先,可以使用循环遍历的方法来匹配数据。通过使用For循环或While循环,我们可以逐行或逐个元素地比较数据,并找到匹配的结果。然而,这种方法在处理大量数据时可能效率较低,因为它需要耗费大量的时间和计算资源。 其次,可以使用VBA中的数组来进行大量数据匹配。我们可以将待匹配数据存储在数组中,然后使用循环遍历数组进行匹配。相比于循环遍历单个元素,使用数组可以减少循环的次数,从而提高匹配的速度。 另外,我们还可以使用VBA中的字典(Dictionary)对象进行大量数据匹配。字典是一种键值对的数据结构,可以存储多个键和对应的值。我们可以将待匹配数据作为字典的键,将对应的结果作为字典的值,然后使用字典的查找方法来获取匹配的结果。字典的查找速度非常快,特别适合处理大量数据匹配。 此外,我们还可以使用VBA中的数据库查询语言(SQL)来实现大量数据匹配。通过使用SQL查询语句,我们可以根据特定的条件从数据库中筛选和匹配数据,从而快速找到匹配的结果。 总而言之,要实现快速大量数据匹配,我们可以使用VBA中的循环遍历、数组、字典和SQL等多种方法。选择合适的方法取决于具体的需求和数据结构,以确保匹配的效率和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值