【问题标题】:BigQuery: Count consecutive string matches between two fieldsBigQuery:计算两个字段之间的连续字符串匹配
【发布时间】:2021-08-03 16:47:09
【问题描述】:

我有两张桌子:

  1. Master_Equipment_Index(别名 mei)包含列 serial_num 和 model_num
  2. 包含 account_num、serial_num 和 model_num 列的客户设备索引(别名 cei

最初,当插入新的 serial_num 记录时,护栏并未实现要求在 mei 数据中输入模型属性。每当该 serial_num 稍后与 cei 数据中的客户帐户相关联时,模型数据都会作为空值继续。

我想要做的是根据 mei 数据中的 cei 数据中缺失的模型属性,基于来自 mei 中其他类似 serial_nums 的最强顺序字符匹配b>mei 数据。

为了进一步澄清,我无权大规模更新 meicei 数据集。我可以正式提出变更请求,但我需要构建功能以证明其价值。因此,这必须在任何大规模行动查询更新之外完成。

cei.account_num cei.serial_num cei.model mei.serial_num mei.model serial_num_str_match row_number
123123123 B4I4SXT1708 null B4I4SXT178A Model_Series1 8 1
123123123 B4I4SXT1708 null B4I4SXTAS34 Model_Series2 7 2

在上面的表格示例中,row_number 1 的连续字符串匹配计数高于 row_number 2。我只想返回 row_number 1 并使用 mei 填充 cei.model。模型的价值。

cei.account_num cei.serial_num cei.model mei.serial_num mei.model serial_num_str_match row_number
123123123 B4I4SXT1708 Model_Series1 B4I4SXT178A Model_Series1 8 1

给出一个关于比例的想法:
mei 数据包含 100 万条记录,cei 数据包含 50,000 条记录。我必须为 cei.account_num、cei.serial_num 其中 cei.model 数据为空的每个单个 cei.account_num、cei.serial_num 获取并执行此字符串匹配。

对于 mac 地址,前 6 个字符标识供应商,我可以在下面的示例 SQL 中查看类似的内容,以帮助减少事务量 1:发生许多查找:

/* need to define function */
create temp function string_match_function(x any type, y any type) as (
  syntax to generate consecutive string count matches between x and y
);

select * from (
select
  c.account_num,
  c.serial_num,
  m.model,
  row_number() over(partition by c.account_num, c.serial_num order by serial_num_str_match desc) seq
from (
     select 
       c.account_num, 
       c.serial_num, 
       m.model,

       needed: string_match_function(c.serial_num, m.serial_num) as serial_num_str_match

     from (
          select * from cei where model is null
          ) c
     join (
          select * from mei where model is not null
          ) m on substr(c.serial_num,1,6) = substr(m.serial_num,1,6)
) as a
) as b
where seq = 1

我查看了不同的选项,其中一些来自 https://hoffa.medium.com/new-in-bigquery-persistent-udfs-c9ea4100fd83,但我没有找到我需要的选项。

任何见解或方向将不胜感激。

【问题讨论】:

    标签: google-bigquery bigquery-udf


    【解决方案1】:

    此 UDF 函数从开头计算每个字符串中相等的字符:

    CREATE TEMP FUNCTION string_match_function(x string, y string)
    RETURNS int64
    LANGUAGE js
    AS r"""
      var i=0;
      var max_len= Math.min(x.length,y.length);
        for(i=0;i<max_len;i++){
            if(x[i]!=y[i]) {return i;}
        }
      return i;
    """;
    
    select string_match_function("12a345","1234")
    

    给出 2,因为两者都以 12 开头

    【讨论】:

    • 我以为昨天发表了评论,但事实并非如此。这正是我们想要的。非常感谢!
    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 2021-02-15
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多