BigQuery: неожиданный результат после фильтрации таблицы - PullRequest
0 голосов
/ 25 января 2019

Учитывая следующий запрос (очень упрощенный):

SELECT hits.page.pagepath AS Page
FROM
    `[projectid].[datasetid].ga_sessions_*` t, t.hits as hits
  WHERE
  _TABLE_SUFFIX BETWEEN '20190123' AND '20190123' 
  AND (SELECT COUNT(*)>0 FROM t.hits WHERE REGEXP_CONTAINS(hits.page.pagepath,r'dames'))

Я ожидал, что этот запрос вернет только те страницы, которые содержат 'dames', но на самом деле это не так. С этим фильтром в разделе ГДЕ ..

(SELECT COUNT(*)>0 FROM t.hits WHERE REGEXP_CONTAINS(hits.page.pagepath,r'dames'))

.. там сплющено на уровне попаданий и отфильтровано только на страницах дам. В основном запросе также сплющено на уровне попаданий. Таким образом, я ожидаю, что в каждом обращении будут ИСТИНА и ЛОЖЬ, где только ИСТИНА останутся в конечном наборе данных, а именно только страницы, которые содержат «дам».

Я знаю запросы, которые возвращают ожидаемый результат, но мой основной вопрос (просто для понимания, почему этот запрос не работает) на самом деле больше: почему этот запрос не работает, как ожидалось?

Заранее спасибо!

1 Ответ

0 голосов
/ 25 января 2019

Вы должны понимать, что перекрестное объединение неопубликованного массива с его родительской строкой не совсем выравнивает исходную таблицу.Он повторяет родительскую строку для каждой строки в массиве: в этом случае каждая информация о сеансе повторяется для каждого попадания: и сам массив попаданий!

Это означает, что для каждого попадания вы можете искать материал во всей сессиипотому что для каждого попадания доступны все попадания, потому что они тоже были повторены.

Вы обращаетесь к этому массиву повторных попаданий в своем предложении WHERE.

Вместо написания подвыборав этом повторяющемся массиве вы хотите использовать недавно доступные перекрестно объединенные поля из этого массива, т.е. AND REGEXP_CONTAINS(hits.page.pagepath,r'dames')

В вашем случае это может быть немного запутанным, поскольку ваш псевдоним для сглаженных совпадений - это попадания какхорошо - возможно, вы захотите переименовать его во что-то другое, например h, чтобы ваш НЕ рабочий запрос выглядел следующим образом

SELECT h.page.pagepath AS Page
FROM
    `[projectid].[datasetid].ga_sessions_*` t, t.hits as h
  WHERE
  _TABLE_SUFFIX BETWEEN '20190123' AND '20190123' 
  AND (SELECT COUNT(*)>0 FROM t.hits h2 WHERE REGEXP_CONTAINS(h.page.pagepath,r'dames'))

Вы проверяете для каждой страницы, содержит ли весь сеанс страницу, выполняющуюваше состояние.

РАБОЧИЙ пример будет

SELECT h.page.pagepath AS Page
FROM
    `[projectid].[datasetid].ga_sessions_*` t, t.hits as h
  WHERE
  _TABLE_SUFFIX BETWEEN '20190123' AND '20190123' 
  AND REGEXP_CONTAINS(h.page.pagepath,r'dames')
...