BigQuery:是否可以在 UDF 中执行另一个查询?
BigQuery : is it possible to execute another query inside an UDF?
我有一个 table 每天为每个唯一用户记录一行,以及该用户当天的一些汇总统计信息,我需要生成一份报告,告诉我每一天,没有.过去 30 天(包括那一天)的唯一身份用户数。
例如。
- 对于 8 月 31 日,它将计算 8 月 2 日至 8 月 31 日的唯一身份用户
- 对于 8 月 30 日,它将计算 8 月 1 日至 8 月 30 日的唯一身份用户
- 等等...
我查看了一些相关问题,但它们并不是我所需要的 - 如果用户在过去 30 天内多次登录,他应该只被计算一次,所以我不能只求和过去 30 天的 DAU 计数。
Bigquery SQL for sliding window aggregate
BigQuery SQL for 28-day sliding window aggregate (without writing 28 lines of SQL)
到目前为止,我的想法是:
- 编写一个简单的脚本,为每个相关的日子执行一个单独的 BigQuery
- 编写一个 BigQuery UDF,它将对从另一个查询中选择的每一天执行基本相同的查询
但我还没有找到任何关于如何在 UDF 中执行另一个 BigQuery 查询的示例,或者如果可能的话。
I need to produce a report that tells me for each day, the no. of
unique users in the last 30 days including that day.
下面应该这样做
SELECT
calendar_day,
EXACT_COUNT_DISTINCT(userID) AS unique_users
FROM (
SELECT calendar_day, userID
FROM YourTable
CROSS JOIN (
SELECT DATE(DATE_ADD('2016-08-08', pos - 1, "DAY")) AS calendar_day
FROM (
SELECT ROW_NUMBER() OVER() AS pos, *
FROM (FLATTEN((
SELECT SPLIT(RPAD('', 1 + DATEDIFF('2016-09-08', '2016-08-08'), '.'),'') AS h
FROM (SELECT NULL)),h
)))
) AS calendar
WHERE DATEDIFF(calendar_day, dt) BETWEEN 0 AND 29
)
GROUP BY calendar_day
ORDER BY calendar_day DESC
假设 YourTable 有 userID 和 dt 字段(如下例)
dt userID
2016-09-08 1
2016-09-08 2
...
你可以控制:
- 通过分别更改 2016-08-08
和 2016-09-08
来报告日期范围
- 通过在 BETWEEN 0 AND 29
中更改 29
来聚合大小
我有一个 table 每天为每个唯一用户记录一行,以及该用户当天的一些汇总统计信息,我需要生成一份报告,告诉我每一天,没有.过去 30 天(包括那一天)的唯一身份用户数。
例如。
- 对于 8 月 31 日,它将计算 8 月 2 日至 8 月 31 日的唯一身份用户
- 对于 8 月 30 日,它将计算 8 月 1 日至 8 月 30 日的唯一身份用户
- 等等...
我查看了一些相关问题,但它们并不是我所需要的 - 如果用户在过去 30 天内多次登录,他应该只被计算一次,所以我不能只求和过去 30 天的 DAU 计数。
Bigquery SQL for sliding window aggregate
BigQuery SQL for 28-day sliding window aggregate (without writing 28 lines of SQL)
到目前为止,我的想法是:
- 编写一个简单的脚本,为每个相关的日子执行一个单独的 BigQuery
- 编写一个 BigQuery UDF,它将对从另一个查询中选择的每一天执行基本相同的查询
但我还没有找到任何关于如何在 UDF 中执行另一个 BigQuery 查询的示例,或者如果可能的话。
I need to produce a report that tells me for each day, the no. of unique users in the last 30 days including that day.
下面应该这样做
SELECT
calendar_day,
EXACT_COUNT_DISTINCT(userID) AS unique_users
FROM (
SELECT calendar_day, userID
FROM YourTable
CROSS JOIN (
SELECT DATE(DATE_ADD('2016-08-08', pos - 1, "DAY")) AS calendar_day
FROM (
SELECT ROW_NUMBER() OVER() AS pos, *
FROM (FLATTEN((
SELECT SPLIT(RPAD('', 1 + DATEDIFF('2016-09-08', '2016-08-08'), '.'),'') AS h
FROM (SELECT NULL)),h
)))
) AS calendar
WHERE DATEDIFF(calendar_day, dt) BETWEEN 0 AND 29
)
GROUP BY calendar_day
ORDER BY calendar_day DESC
假设 YourTable 有 userID 和 dt 字段(如下例)
dt userID
2016-09-08 1
2016-09-08 2
...
你可以控制:
- 通过分别更改 2016-08-08
和 2016-09-08
来报告日期范围
- 通过在 BETWEEN 0 AND 29
29
来聚合大小