【问题标题】:Google BigQuery cross joinGoogle BigQuery 交叉联接
【发布时间】:2016-09-13 13:34:20
【问题描述】:

我正在使用交叉连接来访问 2 个表中的数据。但是使用交叉连接时,我收到错误“d.DebugData not found in table "bigdata:RawDebug.CarrierDetails"。任何帮助将不胜感激!

SELECT 
HardwareId, DebugReason, DebugData, 
CASE
  WHEN REGEXP_MATCH(DebugData,'\\d+') THEN c.Network
  ELSE REGEXP_REPLACE(DebugData,'\\?',' ')
END
as ActualDebugData 
FROM(
 SELECT 
 HardwareId, DebugReason, DebugData
 FROM TABLE_DATE_RANGE([bigdata:RawDebug.T],TIMESTAMP ('2016-05-15'),TIMESTAMP('2016-05-15'))
 WHERE Reason = 500  
 ) as d
 CROSS JOIN (
   SELECT Network 
   FROM [bigdata:RawDebug.CarrierDetails] 
   WHERE Mcc = substr(d.DebugData,0,3) AND Mnc =   substr(d.DebugData,4,LENGTH(d.Reason - 1)) 
   LIMIT 1 
 ) AS c

试过了,但我得到了这个错误:“ON 子句必须是 AND of = 每个表中一个字段名的比较,所有字段名都以表名作为前缀。”

 %%sql --module Test2
 DEFINE QUERY Test2
 SELECT 
 HardwareId, DebugReason, DebugData, 
 CASE
  WHEN REGEXP_MATCH(DebugData,'\\d+') THEN c.Network
  ELSE REGEXP_REPLACE(DebugData,'\\?',' ')
 END AS ActualDebugData 
 FROM (
 SELECT 
   HardwareId, DebugReason, DebugData, 
   SUBSTR(DebugData,0,3) AS d1, REGEXP_REPLACE(SUBSTR(DebugData,3,LENGTH(DebugData)-1),'%[^a-zA-Z0-9, ]%',' ') as d2
   FROM TABLE_DATE_RANGE([bigdata:RawDebug.T],TIMESTAMP('2016-05-15'),TIMESTAMP('2016-05-15'))
   WHERE DebugReason = 500  
   ) AS d
   LEFT JOIN (
   SELECT 
    Network, Mcc, Mnc
    ,ROW_NUMBER() OVER(PARTITION BY Mcc, Mnc) AS pos 
    FROM [bigdata:RawDebug.CarrierDetails] 
    ) AS c
    ON c.Mcc = INTEGER(d.d1) AND c.Mnc = INTEGER(d.d2)  
    WHERE c.pos = 1

我正在添加以下结构:

 RawDebug:
 HardwareId   DebugReason   DebugData   
 550029358    50013            VER%     
 550029359    50013            RO%      
 550029360    50013            34020?   
 550029361    50013            34021?

当 DebugData 有字符时,我有匹配它的 case 语句,当它有数字时,我必须取前 3 个字符的子字符串并将其与 Carrierdetails 中的 Mcc 和剩余字符匹配,并将其与 Carrierdetails 中的 Mnc 匹配.

对于最近的查询,它不会考虑所有情况。相反,它需要一个特定的数字并为所有行使用 tat ActualDebugData。

【问题讨论】:

    标签: google-bigquery cross-join


    【解决方案1】:
    SELECT 
      HardwareId, DebugReason, DebugData, 
      CASE
        WHEN REGEXP_MATCH(DebugData,'\\d+') THEN c.Network
        ELSE REGEXP_REPLACE(DebugData,'\\?',' ')
      END AS ActualDebugData 
    FROM (
      SELECT 
        HardwareId, DebugReason, DebugData, 
        SUBSTR(DebugData,0,3) AS d1, SUBSTR(DebugData,4,LENGTH(Reason - 1)) AS d2 
      FROM TABLE_DATE_RANGE([bigdata:RawDebug.T],TIMESTAMP('2016-05-15'),TIMESTAMP('2016-05-15'))
      WHERE Reason = 500  
    ) AS d
    LEFT JOIN (
      SELECT 
        Network, Mcc, Mnc
        //,ROW_NUMBER() OVER(PARTITION BY Mcc, Mnc) AS pos 
      FROM [bigdata:RawDebug.CarrierDetails] 
    ) AS c
    ON c.Mcc = d.d1 AND c.Mnc = d.d2  
    //WHERE c.pos = 1 
    

    如果network 保证对于 d 中的每个条目都是唯一的 - 您可以删除注释行。
    否则你应该取消他们的注释

    【讨论】:

    • 我已经尝试了问题部分中的代码。但它会抛出错误“ON 子句必须是 AND of = 比较每个表中的一个字段名称,所有字段名称都以表名称为前缀。”
    • 不知道你是否注意到了——但这不是我的回答!如果您需要将它们转换为整数,则不需要在 ON 语句中执行此操作,而是在子选择中执行此操作!!!例如INTEGER(SUBSTR(DebugData,0,3)) AS d1
    • 此查询未按预期工作。它需要一个特定的数字并将其用于所有不同的硬件 ID。
    • 对于我的要求,只有当它是数字时才应该计算该子字符串。对于字符串,不应该做子字符串部分。使用当前查询,它计算所有行的子字符串。这可能是它无法按预期工作的原因之一。
    • 您不断在原始问题中添加一些内容。这不是它在这里的工作方式。要么您从一开始就制定完整的问题,要么每次添加新要求时都请提出问题:o)这不是我们讨论您的项目或集体工作的论坛 - 这是问答式的交流方式。新问题 - 新答案!
    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    相关资源
    最近更新 更多