在 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 中使用窗口函数创建活动季度的运行总和的主要内容,如果未能解决你的问题,请参考以下文章