Я использую 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 для всех строк.
Я пробовал код, который находится в разделе вопросов. Но он выдает ошибку. «Предложение ON должно быть И = сопоставления одного имени поля из каждой таблицы со всеми именами полей с префиксом имени таблицы». – user3447653
не знаю, заметили ли вы - но это не то, что в моем ответе! если вам нужно отбросить их в целые числа, вам нужно сделать это не в инструкции ON, а скорее с подзапросами !!! например, как «INTEGER (SUBSTR (DebugData, 0,3)) AS d1' –
Этот запрос не работает должным образом. Он скорее принимает одно конкретное число и использует его для всех различных идентификаторов оборудования. – user3447653