2016-11-15 5 views
0

Я пытаюсь соединить две таблицы на вычисляемого поля:BigQuery Регистрация на вычисляемое поле

SELECT 
    CONCAT(year, mo, da) AS date, 
    temp 
FROM 
    [bigquery-public-data:noaa_gsod.gsod2016] AS a 
JOIN 
    [bigquery-public-data:noaa_gsod.stations] AS b 
ON 
    a.stn = b.usaf 
    AND a.wban = b.wban 
JOIN 
    [test-project:0000.ga_sessions_20161002] AS c 
ON 
    c.date = CONCAT(a.year, a.mo, a.da) 
WHERE 
    b.name = "DUBAI INTL" 
ORDER BY 
    a.year ASC, 
    a.mo ASC, 
    a.da ASC 

я получаю следующее сообщение об ошибке:

ON clause must be AND of = comparisons of one field name from each table, with all field names prefixed with table name

Я полагаю, эта ошибка является результатом второй оператор ON, но я префикс всех имен полей с их именем таблицы.

Что я делаю неправильно?

+0

Вместо использования таблицы a используйте подзапрос, который выполняет желаемую функцию для вас. В стороне, c.date строка? –

ответ

3

Вам необходимо включить standard SQL для запроса вместо этого. После того, как вы делаете (снимите флажок «Использовать прежние SQL» в разделе «Show Options») можно запустить, например:

SELECT 
    CONCAT(year, mo, da) AS date, 
    temp 
FROM 
    `bigquery-public-data.noaa_gsod.gsod2016` AS a 
JOIN 
    `bigquery-public-data.noaa_gsod.stations` AS b 
ON 
    a.stn = b.usaf 
    AND a.wban = b.wban 
JOIN 
    `test-project.0000.ga_sessions_20161002` AS c 
ON 
    c.date = CONCAT(a.year, a.mo, a.da) 
WHERE 
    b.name = "DUBAI INTL" 
ORDER BY 
    a.year ASC, 
    a.mo ASC, 
    a.da ASC; 

Вот автономный пример, который не опирается на ga_session стол, тоже:

WITH MyTable AS (
    SELECT '20161003' AS date UNION ALL 
    SELECT '20160830' 
) 
SELECT 
    CONCAT(year, mo, da) AS date, 
    temp 
FROM 
    `bigquery-public-data.noaa_gsod.gsod2016` AS a 
JOIN 
    `bigquery-public-data.noaa_gsod.stations` AS b 
ON 
    a.stn = b.usaf 
    AND a.wban = b.wban 
JOIN 
    MyTable AS c 
ON 
    c.date = CONCAT(a.year, a.mo, a.da) 
WHERE 
    b.name = "DUBAI INTL" 
ORDER BY 
    a.year ASC, 
    a.mo ASC, 
    a.da ASC; 
+0

Спасибо! Это сделал трюк. Я был немного смущен, почему вы добавили определение «MyTable» наверху, но это имело смысл после того, как я посмотрел на оператор UNION ALL. Я думаю, что лучше вернуться к использованию таблицы 'ga_sessions_20161002' в вашем ответе, чтобы было более ясно, как ответ напрямую связан с вопросом. – faridghar

+0

Несомненно, я обновил пример использования ваших исходных таблиц, хотя я также оставил автономный пример, если другие читатели захотят попробовать его. Благодаря! –

0

Попробуйте использовать подзапрос:

FROM (SELECT a.*, date(CONCAT(a.year, a.mo, a.da)) as yyyymmdd 
     FROM [bigquery-public-data:noaa_gsod.gsod2016] a 
    ) a JOIN 
    [bigquery-public-data:noaa_gsod.stations] b 
    ON a.stn = b.usaf AND a.wban = b.wban JOIN 
    [test-project:0000.ga_sessions_20161002] c 
    ON c.date = a.yyyymmdd 

Или что-то вроде этого. , , точное сравнение может зависеть от типа c.date.

0

JOIN, который вы используете, является INNER JOIN по умолчанию, поэтому предложение ON может выполнять простое равенство по столбцам.

Для работы вокруг вам необходимо использовать перекрестное соединение с ИНЕКЕ:

SELECT 
    CONCAT(year, mo, da) AS date, 
    temp 
FROM 
    [bigquery-public-data:noaa_gsod.gsod2016] AS a 
JOIN 
    [bigquery-public-data:noaa_gsod.stations] AS b 
ON 
    a.stn = b.usaf 
    AND a.wban = b.wban 
CROSS JOIN 
    [test-project:0000.ga_sessions_20161002] AS c 
WHERE 
    b.name = "DUBAI INTL" 
AND 
    c.date = CONCAT(a.year, a.mo, a.da) 
ORDER BY 
    a.year ASC, 
    a.mo ASC, 
    a.da ASC 
+1

Это будет означать вычисление всего поперечного произведения двух таблиц до фильтрации. Было бы лучше либо вычислить 'CONCAT (...)' в подзапросе до 'INNER JOIN', либо использовать [стандартный SQL] (https://cloud.google.com/bigquery/docs/reference/ стандартный SQL /). –

 Смежные вопросы

  • Нет связанных вопросов^_^