如何比较几段数据,以便能够找到数据符号前两个字符的字符串差异?
因此,例如,如果我有电子邮件,并且仅在彼此之间创建了一天的情况下,并且只想拉出出现在“ @”之前的最后两个字符中的两个电子邮件之间有1个字符差异的事件。所以-
即
samfake@gmail.com 2018-09-01
johnslife@googlio.com 2018-09-20
samfake1@gmail.com 2018-09-02
sarahshouse@yahoo.com 2018-08-01
sarahshouse4@yahoo.com 2018-08-01
samfake4@gmail.com 2018-08-02
notgoing@hotmail.com 2016-02-04
notgoing3@hotmail.com 2018-05-04
,我想看看可以提取这些电子邮件的地方:
samfake@gmail.com
samfake1@gmail.com
sarahshouse@yahoo.com
sarahshouse4@yahoo.com
samfake4@gmail.com
鉴于所比较的数据彼此之间在一天之内,因此与至少一封其他电子邮件相比,“ @”符号前的最后一位数字相差1。指定在SQL中进行这些比较期间电子邮件的其余部分必须保持相同的条件将非常好。因此,字符差= 1的唯一位置是'@'之前的最后一位
答案 0 :(得分:3)
以下是用于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_DATE(DATE(dt))
然后
答案 1 :(得分:0)
co-related子查询,唯一名称的一种近似方法
select * from t
where exists ( select 1 from t t1 where t1.email like '%'+t.email+'%'
and t1.date=t.date)