Sql BigQuery每月活动用户?
我目前正在对此进行查询。该查询是用遗留SQL编写的,在我的环境中不起作用。我修改了查询以使用现代SQL函数,并更新了Sql BigQuery每月活动用户?,sql,firebase,google-bigquery,firebase-analytics,Sql,Firebase,Google Bigquery,Firebase Analytics,我目前正在对此进行查询。该查询是用遗留SQL编写的,在我的环境中不起作用。我修改了查询以使用现代SQL函数,并更新了selectdateasdate以使用timestamp\u micros 我还应该提到,我试图选择的行来自Firebase Analytics 我的问题是: SELECT FORMAT_TIMESTAMP('%Y-%m-%d', TIMESTAMP_MICROS(event.timestamp_micros)) as date, SUM(CASE WHEN pe
selectdateasdate
以使用timestamp\u micros
我还应该提到,我试图选择的行来自Firebase Analytics
我的问题是:
SELECT
FORMAT_TIMESTAMP('%Y-%m-%d', TIMESTAMP_MICROS(event.timestamp_micros)) as date,
SUM(CASE WHEN period = 7 THEN users END) as days_07,
SUM(CASE WHEN period = 14 THEN users END) as days_14,
SUM(CASE WHEN period = 30 THEN users END) as days_30
FROM (
SELECT
FORMAT_TIMESTAMP('%Y-%m-%d', TIMESTAMP_MICROS(event.timestamp_micros)) as date,
periods.period as period,
COUNT(DISTINCT user_dim.app_info.app_instance_id) as users
FROM `com_sidearm_fanapp_uiowa_IOS.*` as activity
CROSS JOIN
UNNEST(event_dim) as event
CROSS JOIN (
SELECT
FORMAT_TIMESTAMP('%Y-%m-%d', TIMESTAMP_MICROS(event.timestamp_micros)) as date
FROM `com_sidearm_fanapp_uiowa_IOS.*`
CROSS JOIN
UNNEST(event_dim) as event
GROUP BY event.timestamp_micros
) as dates
CROSS JOIN (
SELECT
period
FROM
(
SELECT 7 as period
UNION ALL
SELECT 14 as period
UNION ALL
SELECT 30 as period
)
) as periods
WHERE
dates.date >= activity.date
AND
SAFE_CAST(FLOOR(TIMESTAMP_DIFF(dates.date, activity.date, DAY)/periods.period) AS INT64) = 0
GROUP BY 1,2
)
CROSS JOIN
UNNEST(event_dim) as event
GROUP BY date
ORDER BY date DESC
列名句点在[24:13]错误处不明确
要修复此特定错误,您应该在下面进行修复
CROSS JOIN (
SELECT
period
FROM
(SELECT 7 as period),
(SELECT 14 as period),
(SELECT 30 as period)
) as periods
所以它应该看起来像:
CROSS JOIN (
SELECT
period
FROM
(SELECT 7 as period UNION ALL
SELECT 14 as period UNION ALL
SELECT 30 as period)
) as periods
回答您的最新问题
试试下面。我没有机会测试它,但希望它能帮助您修复您的查询
SELECT
date,
SUM(CASE WHEN period = 7 THEN users END) as days_07,
SUM(CASE WHEN period = 14 THEN users END) as days_14,
SUM(CASE WHEN period = 30 THEN users END) as days_30
FROM (
SELECT
activity.date as date,
periods.period as period,
COUNT(DISTINCT user) as users
FROM (
SELECT
event.timestamp_micros as date,
user_dim.app_info.app_instance_id as user
FROM `yourTable` CROSS JOIN UNNEST(event_dim) as event
) as activity
CROSS JOIN (
SELECT
event.timestamp_micros as date
FROM `yourTable` CROSS JOIN UNNEST(event_dim) as event
GROUP BY event.timestamp_micros
) as dates
CROSS JOIN (
SELECT period
FROM
(SELECT 7 as period UNION ALL
SELECT 14 as period UNION ALL
SELECT 30 as period)
) as periods
WHERE dates.date >= activity.date
AND SAFE_CAST(FLOOR(TIMESTAMP_DIFF(TIMESTAMP_MICROS(dates.date), TIMESTAMP_MICROS(activity.date), DAY)/periods.period) AS INT64) = 0
GROUP BY 1,2
)
GROUP BY date
ORDER BY date DESC
这是可行的,但现在它抛出了另一个错误:
Name date not found in activity at[31:32]
,正如您在问题中提到的那样-原始查询是为不同的表编写的,该表中有date
字段。因此,您需要确保您使用的是表中存在的字段。我查询的字段确实存在于我的表中。这一点我是肯定的。我已将日期更改为时间戳,请参见更新的问题。我事件更改了日期字段的格式,以匹配原始旧版SQL查询中的内容。@JoeScotto-情况并非如此-如果您有新问题,应将其作为新问题发布。相反,你不断地改变现有的问题,从而使你原来问题的答案完全无效!作为一个例外(对我自己来说),我会再回答一次——但在将来——我不会回答这样永无止境的一体化问题。顺便说一句——通常你的问题的标题不应该是你正在处理的项目或任务名称——而是你有一个明确、简短和具体的问题。我知道这并不总是简单的——但这就是为什么对其他访问本文的人来说,BQ导出模式是这样定义的。