【问题标题】:BigQuery : is it possible to execute another query inside an UDF?BigQuery:是否可以在 UDF 中执行另一个查询?
【发布时间】:2017-01-16 22:00:51
【问题描述】:

我有一个表格,每天为每个唯一用户记录一行,其中包含该用户当天的一些汇总统计信息,我需要生成一份报告,告诉我每天的情况,不。过去 30 天内(包括当天)的唯一身份用户数。

例如。

  • 对于 8 月 31 日,它将计算 8 月 2 日至 8 月 31 日的唯一用户数
  • 对于 8 月 30 日,它将计算 8 月 1 日至 8 月 30 日的唯一用户数
  • 等等……

我查看了一些相关问题,但它们并不是我所需要的 - 如果用户在过去 30 天内多次登录,他应该只计算一次,所以我不能只计算 DAU计算过去 30 天。

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 查询的示例,或者是否有可能。

【问题讨论】:

    标签: google-bigquery user-defined-functions sliding-window bigdata


    【解决方案1】:

    我需要制作一份报告,告诉我每天的情况,不。的 包括当天在内的过去 30 天内的唯一身份用户。

    下面应该这样做

    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-082016-09-08 来报告日期范围
    - 通过更改BETWEEN 0 AND 29 中的29 来聚合大小

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      相关资源
      最近更新 更多