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

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封其他

如何比较几段数据,以便在数据符号之前的最后两个字符中找到字符串差异

例如,如果我有电子邮件,并且只想提取在“@”之前的最后两个字符中两封电子邮件之间存在1个字符差异的事件,前提是在彼此之间创建了一天。所以-

i、 e

我想看看我能在哪里收到这些邮件:

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