BigQuery:计算两个字段之间的连续字符串匹配
BigQuery: Count consecutive string matches between two fields
我有两个 table:
- Master_Equipment_Index(别名 mei)包含列 serial_num 和 model_num
- 客户设备索引(别名 cei)包含列 account_num、serial_num 和 model_num
最初,未实现保护 rails 以要求在插入新 serial_num 记录时在 mei 数据中输入模型属性。每当 serial_num 稍后与 cei 数据中的客户帐户相关联时,模型数据将保留为空。
我要做的是根据最强的顺序字符从mei数据中回填cei数据中缺少的模型属性来自 mei 数据中其他类似 serial_num 的匹配。
进一步说明,我无权批量更新 mei 或 cei 数据集。我可以将变更请求形式化,但我需要构建功能以证明其价值。因此,这必须在任何大规模操作查询更新之外完成。
cei.account_num
cei.serial_num
cei.model
mei.serial_num
mei.model
serial_num_str_match
row_number
123123123
B4I4SXT1708
无
B4I4SXT178A
Model_Series1
8
1
123123123
B4I4SXT1708
无
B4I4SXTAS34
Model_Series2
7
2
在上面的 table 示例中 row_number 1 的连续字符串匹配计数高于 row_number 2。我只想 return row_number 1并用 mei.model 的值填充 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.模型数据为空
对于 mac 地址,前 6 个字符标识供应商,我可以在下面的示例 SQL 中以类似的方式查看内容,以帮助减少事务性 1:Many 查找的数量地点:
/* 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,但我没有找到我需要的选项。
任何见解或方向将不胜感激。
此 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
开头
我有两个 table:
- Master_Equipment_Index(别名 mei)包含列 serial_num 和 model_num
- 客户设备索引(别名 cei)包含列 account_num、serial_num 和 model_num
最初,未实现保护 rails 以要求在插入新 serial_num 记录时在 mei 数据中输入模型属性。每当 serial_num 稍后与 cei 数据中的客户帐户相关联时,模型数据将保留为空。
我要做的是根据最强的顺序字符从mei数据中回填cei数据中缺少的模型属性来自 mei 数据中其他类似 serial_num 的匹配。
进一步说明,我无权批量更新 mei 或 cei 数据集。我可以将变更请求形式化,但我需要构建功能以证明其价值。因此,这必须在任何大规模操作查询更新之外完成。
cei.account_num | cei.serial_num | cei.model | mei.serial_num | mei.model | serial_num_str_match | row_number |
---|---|---|---|---|---|---|
123123123 | B4I4SXT1708 | 无 | B4I4SXT178A | Model_Series1 | 8 | 1 |
123123123 | B4I4SXT1708 | 无 | B4I4SXTAS34 | Model_Series2 | 7 | 2 |
在上面的 table 示例中 row_number 1 的连续字符串匹配计数高于 row_number 2。我只想 return row_number 1并用 mei.model 的值填充 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.模型数据为空
对于 mac 地址,前 6 个字符标识供应商,我可以在下面的示例 SQL 中以类似的方式查看内容,以帮助减少事务性 1:Many 查找的数量地点:
/* 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,但我没有找到我需要的选项。
任何见解或方向将不胜感激。
此 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