Sql BigQuery中特定位置的数字提取与比较
如何比较几段数据,以便在数据符号之前的最后两个字符中找到字符串差异 例如,如果我有电子邮件,并且只想提取在“@”之前的最后两个字符中两封电子邮件之间存在1个字符差异的事件,前提是在彼此之间创建了一天。所以- i、 e 我想看看我能在哪里收到这些邮件:Sql BigQuery中特定位置的数字提取与比较,sql,google-bigquery,Sql,Google Bigquery,如何比较几段数据,以便在数据符号之前的最后两个字符中找到字符串差异 例如,如果我有电子邮件,并且只想提取在“@”之前的最后两个字符中两封电子邮件之间存在1个字符差异的事件,前提是在彼此之间创建了一天。所以- i、 e 我想看看我能在哪里收到这些邮件: samfake@gmail.com samfake1@gmail.com sarahshouse@yahoo.com sarahshouse4@yahoo.com samfake4@gmail.com 如果“@”符号前的最后一位数字与至少1封其他
samfake@gmail.com
samfake1@gmail.com
sarahshouse@yahoo.com
sarahshouse4@yahoo.com
samfake4@gmail.com
如果“@”符号前的最后一位数字与至少1封其他电子邮件相比相差1,则所比较的数据在一天之内。最好指定一个条件,在SQL中进行这些比较时,电子邮件的其余部分必须保持不变。因此,字符差=1的唯一位置是“@”之前的最后一个数字。相关子查询,这是唯一名称情况下的一种近似方法
select * from t
where exists ( select 1 from t t1 where t1.email like '%'+t.email+'%'
and t1.date=t.date)
下面是BigQuery标准SQL
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'samfake@gmail.com' email, DATE '2018-09-01' dt UNION ALL
SELECT 'johnslife@googlio.com', '2018-09-20' UNION ALL
SELECT 'samfake1@gmail.com', '2018-09-02' UNION ALL
SELECT 'sarahshouse@yahoo.com', '2018-08-01' UNION ALL
SELECT 'sarahshouse4@yahoo.com', '2018-08-01' UNION ALL
SELECT 'samfake4@gmail.com', '2018-08-02' UNION ALL
SELECT 'notgoing@hotmail.com', '2016-02-04' UNION ALL
SELECT 'notgoing3@hotmail.com', '2018-05-04'
), temp AS (
SELECT domain,
ARRAY_AGG(user) OVER(PARTITION BY domain ORDER BY day
RANGE BETWEEN 1 PRECEDING AND CURRENT ROW) users
FROM (
SELECT UNIX_DATE(dt) day,
SUBSTR(email, STRPOS(email, '@')) domain,
SUBSTR(email, 1, STRPOS(email, '@') - 1) user
FROM `project.dataset.table`
)
)
SELECT DISTINCT CONCAT(user, domain) email
FROM temp, UNNEST(
(SELECT ARRAY_CONCAT_AGG([user1, user2])
FROM UNNEST(users) user1, UNNEST(users) user2
WHERE user1 > user2
AND (user1 = SUBSTR(user2, 1, LENGTH(user2) - 1)
OR user2 = SUBSTR(user1, 1, LENGTH(user1) - 1))
)
) user
WHERE ARRAY_LENGTH(users) > 1
结果
Row email
1 samfake1@gmail.com
2 samfake@gmail.com
3 sarahshouse4@yahoo.com
4 sarahshouse@yahoo.com
更新至地址>快速问题,我的日期是时间戳类型
使用
UNIX\u日期(DATE(dt))
。快速提问,我的日期是一个时间戳类型,我得到的返回错误是:参数类型的UNIX\u date函数没有匹配的签名:timestamp。支持的签名:第16行的UNIX_DATE(DATE)。此外,我需要samefake4@gmail.com
是否也显示?它不符合您的一天标准!请澄清!有任何关于samefake4@gmail.com? 基于一天规则-这不应该是好的!谢谢你查看@mikhail-我错了。很好的解决方案。
Row email
1 samfake1@gmail.com
2 samfake@gmail.com
3 sarahshouse4@yahoo.com
4 sarahshouse@yahoo.com