#sql #performance #join #google-bigquery
#sql #Производительность #Присоединиться #google-bigquery
Вопрос:
Это мой первый пост здесь, поэтому, пожалуйста, дайте мне знать, если я сделал что-то не так при публикации моего вопроса.
Я начал изучать SQL с нуля около трех недель назад, и поэтому я довольно новичок во всей концепции и сообществе, и поэтому я, вероятно, допустил много ошибок в своем коде, но вот что происходит.
Я борюсь с запросом, который я пишу в BigQuery. «Валидатор» BigQuery проверил код, поэтому на «бумаге» это кажется хорошим, но для запуска требуется вечность. Он выполняется до такой степени, что я останавливаю его, потому что прошел час. Я искал способы оптимизации своего sql-кодирования, чтобы процессы могли выполняться более плавно и, следовательно, быстрее, но я уперся в стену, где, я думаю, у меня нет вопросов, которые могли бы дать мне полезный ответ.
(Редактировать) Чего я не хочу от этого запроса, так это набора данных, который может помочь мне создать визуализацию, создающую временную шкалу на основе дат / временных меток, которые предоставляет read_started_at. На этой временной шкале я хочу получить отчетливое количество идентификаторов reader_id за данный день / DATE_TRUNC (временная метка). Google Data Studio может сделать отдельный подсчет идентификаторов reader_id, поэтому я сомневаюсь, будет ли выполнение отдельного подсчета в моем запросе замедлять или ускорять процесс в долгосрочной перспективе? Наконец, я хочу разделить reader_id на две группы (измерения) в зависимости от того, подписаны ли они на ежемесячную или годовую подписку, чтобы узнать, больше ли одна группа представлена на данном read_started_at и, следовательно, более активна на веб-сайте, чем другая. Предполагается, что это разделение обеспечивается chargebee_plan_id, где доступно несколько подписок, поэтому существует условие «ежегодно» или «ежемесячно». Reader_id и membership_id содержат одни и те же данные и поэтому ОБЪЕДИНЯЮТСЯ. (Конец редактирования)
Я действительно надеюсь, что кто-нибудь здесь сможет мне помочь. Приветствуются любые советы.
Мой запрос следующий:
WITH memberships AS (
SELECT im.chargebee_plan_id, im.membership_id
FROM postgres.internal_reporting_memberships AS im
WHERE (im.chargebee_plan_id LIKE 'yearly' OR im.chargebee_plan_id LIKE 'monthly')
AND im.started_at >= TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 365 day)
),
readers AS (
SELECT ip.reader_id, DATE_TRUNC(CAST(ip.read_started_at AS DATE), DAY) read_start
FROM postgres.internal_reporting_read_progresses AS ip
WHERE ip.reader_id LIKE '%|%' AND ip.read_started_at >= (TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 365 day)
))
SELECT reader_id, read_start, m.chargebee_plan_id
FROM readers AS r
JOIN memberships AS m
ON r.reader_id LIKE m.membership_id
Приветствия
Комментарии:
1. Предоставьте образцы данных, желаемые результаты и объяснение того, что вы хотите сделать.
2. Измените join на use
=
вместоLIKE
, если это возможно. Это может означать приведение ваших_id
столбцов внутри CTE, если они имеют разные типы данных.3. Теперь вопрос отредактирован. Спасибо за помощь @GordonLinoff
4. И СПАСИБО @rtenha ! Это сработало!
Ответ №1:
Повторная публикация моего комментария в качестве ответа, поскольку это решило проблему.
Используйте =
вместо a LIKE
для условия соединения.