2016-05-17 6 views
2

Я использую cross join для доступа к данным из 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 Предложение должно быть и из = сравнения одного имени поля из каждой таблицы, со всеми именами полей с префиксом имени таблицы «

%%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 ta имеет символы, то у меня есть операторы case, соответствующие ему, когда у него есть цифры, тогда я должен взять подстроку из первых трех символов и сопоставить ее с Mcc в Carrierdetails и оставшимися символами и сопоставить ее с Mnc в Carrierdetails.

С недавним запросом он не учитывает все случаи. Скорее, он принимает одно конкретное число и использует tat 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 гарантированно быть уникальным для каждой записи в г - вы можете удалить комментируемые строки.
В противном случае вы должны расторгнуть их

+0

Я пробовал код, который находится в разделе вопросов. Но он выдает ошибку. «Предложение ON должно быть И = сопоставления одного имени поля из каждой таблицы со всеми именами полей с префиксом имени таблицы». – user3447653

+0

не знаю, заметили ли вы - но это не то, что в моем ответе! если вам нужно отбросить их в целые числа, вам нужно сделать это не в инструкции ON, а скорее с подзапросами !!! например, как «INTEGER (SUBSTR (DebugData, 0,3)) AS d1' –

+0

Этот запрос не работает должным образом. Он скорее принимает одно конкретное число и использует его для всех различных идентификаторов оборудования. – user3447653