Объединять таблицы без одинаковых полей - PullRequest
1 голос
/ 13 марта 2019

Я использую BigQuery для создания отчетов Google Analytics. Я хотел бы создать представление с общим количеством просмотров страниц и общим количеством просмотров страниц за последние 30 дней для каждой имеющейся у меня "страницы". Я могу успешно сделать это для одной страницы, но я получаю ошибки, когда я пробую все страницы одновременно. Я понимаю, почему, но я не уверен, что смогу, и как это сделать для всех моих страниц в одном запросе.

Вот запрос, который я использую для извлечения данных для одной страницы:

SELECT
   (SELECT (SELECT sum(pageviews)
    FROM `centiva_ga_stats_page_views.report`
    WHERE pagepath LIKE '%28848290%')) as pages_views_all_time,

   (SELECT (SELECT sum(pageviews)
    FROM `centiva_ga_stats_page_views.report`
    WHERE pagepath LIKE '%28848290%' 
    AND date > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -30 DAY))) as page_views_30_days

Когда я продолжаю жестко кодировать свой page id запрос, он запускается, но, очевидно, генерирует одинаковые результаты для всех разных страниц, используя этот запрос:

SELECT ins.NO_INSCRIPTION,
    (SELECT (SELECT sum(pageviews)
FROM `centiva_ga_stats_page_views.report`
WHERE pagepath LIKE '%28848290%')) as pages_views_all_time,
(SELECT (SELECT sum(pageviews)
FROM `centiva_ga_stats_page_views.report`
WHERE pagepath LIKE '%28848290%' AND date > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -30 DAY))) as page_views_30_days
FROM staging_remaxlist.Inscriptions ins

Я пытался использовать CONCAT('%',ins.NO_INSCRIPTION,'%') для замены моего закодированного подстановочного знака page id, но я получаю эту ошибку:

LEFT OUTER JOIN не может использоваться без условия, которое является равенством полей с обеих сторон объединения. **

Я вроде понимаю, почему, но у меня нет решения заставить мой запрос работать.

Поле pagepath содержит мой page id, но может быть любым (без стандартного формата)

Любая помощь приветствуется, спасибо!

Вот моя упрощенная схема базы данных:

Таблица staging_remaxlist. Надписи

Field             Type
id                INTEGER 
no_inscription    STRING   

Таблица centiva_ga_stats_page_views.report

Field         Type
date          TIMESTAMP
start_date    TIMESTAMP
end_date      TIMESTAMP
pagepath      STRING
pageviews     INTEGER

Примеры centiva_ga_stats_page_views.report.pagepath:

/en/house-for-sale-laurentides/350-rue-de-lucerne-ste-adele-17269832.rmx
/en/propertyview/12616898
/en/our-properties/gatineau-gatineau/181-rue-duquette-o/12078284
/fr/showproperty/18726771
/wp-content/plugins/hydrogene-wp/public/cache/16543327fr.html
/Properties/enhanceddetails/4e04ec20-M11699403?language=FR

все, что может содержать поле staging_remaxlist.Inscriptions.NO_INSCRIPTION, являющееся целым числом в диапазоне от 7 до 8 (мы должны ожидать, что оно достигнет 9) символов

1 Ответ

1 голос
/ 13 марта 2019

Спасибо за обновленную схему. Похоже, что вы действительно хотите - это соответствие страниц регулярным выражением, а затем использовать это значение соответствия для объединения с таблицей надписей. Следующий запрос должен работать:

WITH total_pageviews AS (
    SELECT 
      CAST(REGEXP_EXTRACT(pagepath, r"[0-9]+") AS INT64) AS pp
      , SUM(pageviews) AS total_pageviews
    FROM `centiva_ga_stats_page_views.report`
    WHERE REGEXP_CONTAINS(pagepath, r"[0-9]+")
    GROUP BY CAST(REGEXP_EXTRACT(pagepath, r"[0-9]+") AS INT64)
)
SELECT pp, total_pageviews, SUM(pageviews) AS page_views_30_days
FROM total_pageviews JOIN `staging_remaxlist.Inscriptions` ins 
  ON ga.pp = ins.NO_INSCRIPTION
WHERE date > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -30 DAY)
GROUP BY pp, total_pageviews

Предыдущий запрос:

WITH page_views_all AS (
    SELECT pagepath AS pp, sum(pageviews) AS page_views_all_time
    FROM `centiva_ga_stats_page_views.report`
    WHERE pagepath LIKE '%28848290%'
    GROUP BY pagepath
)

SELECT pp, page_views_all_time, SUM(pageviews) AS page_views_30_days
FROM page_views_all pva
  INNER JOIN `centiva_ga_stats_page_views.report` pv
  ON pva.pp = pv.pagepath
WHERE pagepath LIKE '%28848290%' 
  AND date > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -30 DAY)
GROUP BY pp, page_views_all_time
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...