Несколько левых соединений в BigQuery - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь сделать рабочий запрос SQL, который у меня есть в BigQuery, более упорядоченным и сталкиваюсь со следующей проблемой:


Ошибка: предложение ON должно быть AND of = сравнения одного имени поля из каждой таблицы со всеми именами полей с префиксом имени таблицы. Подумайте об использовании стандартного SQL .google.com / bigquery / docs / reference / standard-sql /), который допускает неравномерное соединение и сравнение с использованием выражений и остаточных предикатов.


Ниже приведен запрос, который выдает ошибку выше. Первый LEFT JOIN работает. Когда я добавил второй справа внизу, я начал получать сообщение об ошибке. Я пытаюсь получить доступные для чтения значения own.o.firstname и own.o.lastname, а не значение owner_id записи сделки (o.properties.hubspot_owner_id.value), но для этого я нужно объединить несколько таблиц.

Мне пришлось использовать CAST в предложении ON второго JOIN, потому что поля имеют разные типы в соответствующей схеме каждой таблицы. Если я этого не сделаю, я получаю следующую ошибку: Ошибка: ключи соединения o.properties.hubspot_owner_id.value (строка) и o.ownerid (int64) имеют типы, которые не могут быть принудительно принудительно принудительны.

Предложение WHERE является просто списком подавления, чтобы не возвращать записи, которые были удалены из базы данных.

SELECT o.*
FROM (
  SELECT
    o.dealid,
    o.properties.dealname.value,
    stages.Label,
    o.properties.closedate.value,
    o.properties.hubspot_owner_id.value,
    own.o.firstname,
    own.o.lastname,
    o.properties.amount.value,
    o.properties.createdate.value,
    o.properties.pipeline.value,
    o.associations.associatedcompanyids,
    ROW_NUMBER() OVER (PARTITION BY o.dealid ORDER BY o._sdc_batched_at DESC) as seqnum
  FROM [sample-table:hubspot.deals] o
  LEFT JOIN [sample-table:hubspot.sales_stages_lookup] stages ON o.properties.dealstage.value = stages.Internal_Value
  LEFT JOIN [sample-table:hubspot.owners_reporting] own ON CAST(o.properties.hubspot_owner_id.value AS INTEGER) = CAST(own.o.ownerid AS INTEGER)) o
WHERE o.dealid NOT IN (SELECT objectid FROM [sample-table:hubspot_suppression_list.data] WHERE subscriptiontype = 'deal.deletion') AND seqnum = 1

1 Ответ

0 голосов
/ 29 июня 2018

Вместо этого используйте стандартный SQL в BigQuery, который поддерживает выражения как часть предложения ON:

#standardSQL
SELECT o.*
FROM (
  SELECT
    o.dealid,
    o.properties.dealname.value AS dealname_value,
    stages.Label,
    o.properties.closedate.value AS closedate_value,
    o.properties.hubspot_owner_id.value AS hubspot_owner_id_value,
    own.o.firstname,
    own.o.lastname,
    o.properties.amount.value AS amount_value,
    o.properties.createdate.value AS createdate_value,
    o.properties.pipeline.value AS pipeline_value,
    o.associations.associatedcompanyids,
    ROW_NUMBER() OVER (PARTITION BY o.dealid ORDER BY o._sdc_batched_at DESC) as seqnum
  FROM `sample-table.hubspot.deals` o
  LEFT JOIN `sample-table.hubspot.sales_stages_lookup` stages ON o.properties.dealstage.value = stages.Internal_Value
  LEFT JOIN `sample-table.hubspot.owners_reporting` own ON CAST(o.properties.hubspot_owner_id.value AS INT64) = CAST(own.o.ownerid AS INT64)) o
WHERE o.dealid NOT IN (SELECT objectid FROM `sample-table.hubspot_suppression_list.data` WHERE subscriptiontype = 'deal.deletion') AND seqnum = 1

Подробнее о различиях между устаревшим и стандартным SQL в BigQuery см. В руководстве по миграции .

...