在 BigQuery 中使用窗口函数创建活动季度的运行总和

Posted

技术标签:

【中文标题】在 BigQuery 中使用窗口函数创建活动季度的运行总和【英文标题】:Using a window function in BigQuery to create running sum of active quarters 【发布时间】:2020-09-19 19:20:43 【问题描述】:

我正在努力通过创建一个列来增强数据集,该列允许我跟踪给定公司在给定行中拥有多少活跃季度。如果公司在该季度内确认收入,则该公司是“活跃的”。 我的数据集的每一行代表一家公司一个月的业绩。

我已经能够使用 WINDOW 函数成功创建活动月份的运行总和:

COUNTIF(Revenue IS NOT NULL) OVER 
(partition by Company_Name ORDER BY month_end ASC ROWS BETWEEN unbounded preceding and current row) AS cumulative_active_months

我现在正努力将我的逻辑转换为计算季度而不是月份。

这是我的桌子目前看起来的粗略概念。

  Row   Month   Month_end    Fiscal_Quarter   Company_Name   Revenue   Active month count  
 ----- ------- ------------ ---------------- -------------- --------- -------------------- 
  1     Jul     2016-07-31   FY17-Q2          Foo            x,xxx     1                   
  2     Jul     2016-07-31   FY17-Q2          Bar            xxx,xxx   1                   
  3     Aug     2016-08-31   FY17-Q2          Foo            xx,xxx    2                   
  4     Aug     2016-08-31   FY17-Q2          Bar            xxx       2                   
  5     Sep     2016-09-30   FY17-Q2          Foo            xx        3                   
  6     Sep     2016-09-30   FY17-Q2          Bar            x,xxx     3                   
  7     Oct     2016-10-31   FY17-Q3          Foo            xx        4                   
  8     Oct     2016-10-31   FY17-Q3          Bar            Null      3                 

这就是我希望我的桌子的理想外观。

  Row   Month   Month_end    Fiscal_Quarter   Company_Name   Revenue   Active month count   Active quarter count  
 ----- ------- ------------ ---------------- -------------- --------- -------------------- ---------------------- 
  1     Jul     2016-07-31   FY17-Q2          Foo            x,xxx     1                    1                     
  2     Jul     2016-07-31   FY17-Q2          Bar            xxx,xxx   1                    1                     
  3     Aug     2016-08-31   FY17-Q2          Foo            xx,xxx    2                    1                     
  4     Aug     2016-08-31   FY17-Q2          Bar            xxx       2                    1                     
  5     Sep     2016-09-30   FY17-Q2          Foo            xx        3                    1                     
  6     Sep     2016-09-30   FY17-Q2          Bar            x,xxx     3                    1                     
  7     Oct     2016-10-31   FY17-Q3          Foo            xx        4                    2                     
  8     Oct     2016-10-31   FY17-Q3          Bar            Null      3                    1                     

【问题讨论】:

【参考方案1】:

如果这是计算活跃月份:

COUNTIF(Revenue IS NOT NULL) OVER (PARTITION BY Company_Name  ORDER BY month_end ASC) AS cumulative_active_months

那么这是使用COUNT(DISTINCT)的季度的相应计数:

COUNT(DISTINCT CASE WHEN Revenue IS NOT NULL THEN Fiscal_Quarter END)  OVER (PARTITION BY Company_Name ORDER BY month_end ASC) AS cumulative_active_quarters

很遗憾,BigQuery 不支持这一点,因此您可以使用子查询和累积和:

select t.* except (seqnum),
       countif(seqnum = 1) over (partition by company_name order by month_end) as cnt
from (select t.*,
             (case when revenue is not null
                   then row_number() over (partition by Company_Name, Fiscal_Quarter order by month_end)
                   else 0
              end) as seqnum
      from t
     ) t;

注意:在有收入之前,这不计算当前季度,我认为这是有道理的。

【讨论】:

谢谢!据我了解,seqnum 的目的是什么?当我在较大的 BigQuery 数据集中运行您的代码时,会生成两列,一列名为 seqnum,另一列名为“f0_”,在初步检查时,似乎这个 f0_ 列实际上具有我试图在我的问题中解决的计数。这个新列是在哪里生成的?有没有办法重命名? @DanielMoll 。 . .使用 except 可以轻松删除 BigQuery 中的列。需要seqnum 以避免重复计数。

以上是关于在 BigQuery 中使用窗口函数创建活动季度的运行总和的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中使用连接修剪分区?

有没有办法改变这个 BigQuery 自联接以使用窗口函数?

值列表的 BigQUery 重复日期数组

如何创建使用用户定义函数的 BigQuery 视图?

BigQuery 无法查询滞后的大表

在 bigquery UDF 中使用 SQL