我正在 Looker Studio 中构建一些仪表板,需要 3 个 GA4 每日表,这些表每天都会通过 GA4 和 BigQuery 之间的同步添加。
我想查询这些特定的表,因为我们已经运行 GA4 几年了,有 503 个子表,所以当我只想要特定的日期子表时,表名通配符查询需要永远(55GB)。
表添加为 bigquery project.dataset name.events_intraday_date-of-table 为 yyyymmddd 例如, 今天是
my-bigquery-project.analytics-123456789.events_intraday_20241909
昨天是my-bigquery-project.analytics-123456789.events_intraday_20241809
去年是my-bigquery-project.analytics-123456789.events_intraday_20231909
等等
我认为我需要编写一个用户定义的表函数,其参数为今天的日期,然后该函数将对由(某物)返回的临时表运行查询(即使是全选)。显然,今天的日期发生了变化,必须涉及一个参数。
我可以编写一个存储过程来返回当天的结果,没问题,例如,这是一个简单的查询,可以按时间戳获取昨天的购买情况
EXECUTE IMMEDIATE concat("select event_date, event_name, event_timestamp, from ", concat("my-bigquery-project.analytics-123456789.events_intraday_", format_date('%Y%m%d', date_sub(current_date(), interval 1 day))), " WHERE event_name = 'purchase' group by event_date, event_name, event_timestamp order by event_timestamp ASC/* LIMIT 100 */");
我可以将其作为 Looker Studio 中的 BigQuery 自定义 SQL 数据源 请注意,LIMIT 注释是必要的,因为 Looker 会在查询中找不到它时向所有自定义 SQL 添加 LIMIT
但是,虽然 Looker 连接良好并返回架构,但表本身不可用,因为 Looker 然后将其自己的查询包装在您的自定义 SQL 中,即在上面的示例中,它在 BigQuery 中生成
SELECT clmn0_, COUNT(1) AS t0_qt_adhhixz7kd FROM (
SELECT t0.event_date AS clmn0_ FROM (
EXECUTE IMMEDIATE concat("select event_date, event_name, event_timestamp, from ", concat("my- bigquery-project.analytics-123456789.events_intraday_",
format_date('%Y%m%d', date_sub(`current_date`(), INTERVAL 1 day))), " WHERE event_name = 'purchase' group by event_date, event_name, event_timestamp order by event_timestamp ASC/* LIMIT 100 */")
) AS t0
) WHERE (clmn0_ >= '20240919' AND clmn0_ <= '20240919') GROUP BY clmn0_ ORDER BY t0_qt_adhhixz7kd DESC LIMIT 2000001;
失败并出现错误
Syntax error: Expected keyword JOIN but got identifier "concat" at
而且我无法找到一种方法来编写返回 Looker 可以包装其自己的 SQL 的表的任何内容
我在 stackoverflow 和其他地方读过很多随机答案,我认为我必须编写一个接受参数(例如 table_name)的表值函数来执行此操作,但是我总是收到“table_name”错误数据集中不存在,因为它没有评估 table_name。
我认为最接近的是这个答案https://stackoverflow.com/questions/6661505/declare-variable-in-table-valued-function但是我再次陷入了FROM部分。
或这里https://stackoverflow.com/questions/74774856/bigquery-sql-table-function-with-string-interpolation但我只有一个存储过程,如果我在 Looker 中将其称为我的自定义查询,则相同问题如上。
我想我正在追求类似的东西
create table function analytics_123456789.todaystable(x)
AS (
with CTE AS(
[would like to execute something here]
)
select * from CTE
)
但我无法在其中执行或调用?
必须有一种方法来做到这一点,否则,随着在 bigquery 中创建更多的日常表,基于 BigQuery GA4 表的 Lookers 报告将变得站得住脚?
BigQuery 支持使用通配符表查询多个表使用特殊列 _TABLE_SUFFIX:
select event_date, event_name, event_timestamp
from `my-bigquery-project.analytics-123456789.events_intraday_*`
WHERE
_TABLE_SUFFIX = date_sub(current_date(), interval 1 day)
event_name = 'purchase'
group by event_date, event_name, event_timestamp
order by event_timestamp ASC
/* LIMIT 100 */