2016-05-17 14 views
2

私は2つのテーブルからデータにアクセスするためにクロス結合を使用しています。しかし、クロスに参加し、私はエラー「d.DebugDataテーブルに見つからない 『bigdataを得る:RawDebug.CarrierDetails』すべてのヘルプはGoogle BigQuery cross join

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句は、テーブル名が付いすべてのフィールド名と、各テーブルから1フィールド名の=の比較でなければなりません「

%%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? 

DebugDaを最初に3文字の部分文字列を取り、Carrierdetailsと残りの文字でMccにマッチさせて、CarrierdetailsのMncとマッチさせる必要があります。

最近のクエリでは、すべてのケースを考慮していません。むしろ、1つの特定の番号をとり、すべての行にActualDebugDataを使用します。

答えて

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の各エントリの一意であることが保証されて - あなたはコメント行を削除することができます。
それ以外はコメントを外す必要があります

+0

私は質問セクションにあるコードを試しました。しかし、 "ON句は、各テーブルの1つのフィールド名のANDの= ANDでなければならず、すべてのフィールド名の前にテーブル名が付いていなければなりません"というエラーがスローされます。 – user3447653

+0

あなたが気づいたかどうかわかりませんが、これは私の答えにはありません!それらを整数にキャストする必要がある場合は、ONステートメントではなく、subselectsを使用する必要があります。たとえば、 'INTEGER(SUBSTR(DebugData、0,3))AS d1' –

+0

このクエリは期待どおりに機能しません。それはむしろ1つの特定の番号をとり、すべての異なるハードウェアIDに使用します。 – user3447653