【发布时间】:2021-03-01 20:01:12
【问题描述】:
这是我在这里的第一篇文章,所以如果我在发布我的问题时做错了什么,请告诉我。
大约三周前,我开始从零开始学习 SQL,因此我对整个概念和社区还很陌生,因此我的代码中可能犯了很多错误,但还是这样吧。
我正在努力处理我在 BigQuery 中编写的查询。 BigQuery 的“验证器”已经验证了代码,所以在“纸”上看起来不错,但它需要很长时间才能运行。它跑到我停下来的地方,因为它已经过去了一个小时。我一直在寻求简化我的 sql 编码,以便过程可以运行得更顺畅,因此运行得更快,但是我遇到了障碍,我认为我没有问题,这可以为我提供有用的答案.
(编辑) 我不想从这个查询中得到一个数据集,它可以帮助我进行可视化,根据 read_started_at 提供的日期/时间戳创建时间线。 在这个时间线上,我希望在给定的日期/DATE_TRUNC(时间戳)上有一个不同的 reader_id 计数。 Google Data Studio 可以对 reader_id 进行不同的计数,所以我怀疑,从长远来看,在我的查询中进行不同的计数是否会减慢或加快进程? 最后,我想根据 reader_id 是按月订阅还是按年订阅,将它们分为两组(维度),以查看一组在给定的 read_started_at 上是否更具代表性,因此在网站上比其他。此划分应该由chargebee_plan_id 提供,其中有多个订阅可用,因此存在“每年”或“每月”的条件。 reader_id 和 members_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
干杯
【问题讨论】:
-
提供样本数据、期望的结果以及您想要做什么的说明。
-
尽可能将您的加入更改为使用
=而不是LIKE。这可能意味着如果 CTE 的数据类型不同,则将它们转换为_id列。 -
问题现已被编辑。感谢您的帮助@GordonLinoff
-
谢谢@rtenha!成功了!
标签: sql performance join google-bigquery