BigQuery:是否可以在UDF中执行另一个查询?

时间:2016-09-08 20:45:45

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

我有一个表,每天为每个唯一身份用户记录一行,并在当天为该用户提供一些汇总统计信息,我需要生成一份报告,告诉我每天的数据,否。包括当天在内的过去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查询的示例,或者它是否可能。

1 个答案:

答案 0 :(得分:1)

  

我需要制作一份报告,告诉我每天,不。的   过去30天内的独特用户,包括当天。

下面应该这样做

using System;

namespace Something
{
  namespace Finance
  {
    namespace Donations
    {
      public class Electronic1 : Donation
      {
        private PaymentGateway ThisPaymentGateway { get; set; } = new PaymentGateway();

        public void RunController()
        {
          if (DonorType.ToUpper() == "IND" && (PaymentMethod.ToUpper() == "CREDIT CARD" || PaymentMethod.ToUpper() == "ECHECK"))
          {
            ThisPaymentGateway.Process(ref this);
          }
        }
      }
    }
  }
}

它假定YourTable具有userID和dt字段(例如下面的代码)

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

你可以控制:
  - 报告日期范围分别更改dt userID 2016-09-08 1 2016-09-08 2 ... 2016-08-08
  - 通过更改2016-09-08

中的29来确定汇总大小