提取和比较BigQuery中特定位置的数字

时间:2018-09-27 05:24:45

标签: sql google-bigquery

如何比较几段数据,以便能够找到数据符号前两个字符的字符串差异?

因此,例如,如果我有电子邮件,并且仅在彼此之间创建了一天的情况下,并且只想拉出出现在“ @”之前的最后两个字符中的两个电子邮件之间有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的唯一位置是'@'之前的最后一位

2 个答案:

答案 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)