在 Presto 中使用 window 函数时,即使在没有收入的日子里,也将总和保留在累计总和中

Keep the sum even on days without revenue in cumulative sum when using window function in Presto

所以我的问题是,为了清楚起见,我有来自 3 种不同产品的销售数据。我将每周销售 10 个这样的产品,我想将它们可视化为累积总和。我一直在使用以下小片段来获取收入的累计总和。

SUM(revenue) OVER (PARTITION BY purchase_date, product ORDER BY day) AS cumulative_revenue

但是,这还不够,因为我在 window 函数中有 product。只有当我拥有每种产品一周中每一天的销售数据时,它才有效。如果我每周销售 product_1 四件商品,查询结果将仅显示那些日子的累计收入。所以这意味着如果我在星期一到星期三拥有该产品的所有销售量,那么本周剩余时间将不会在输出中列出它们。如果我尝试通过堆叠结果来可视化数据,这会导致问题,因为本周剩余时间的累计收入将低于本周初。

所以我想要的是让它在一周的所有日子里显示所有产品的收入为 0。我当然可以用一些交叉连接魔术来做到这一点,但是它很慢,因为我有很多行,所以有没有办法用 window 函数来做到这一点?

我的数据看起来有点像这样

purchase_date|product|buyer|revenue
-----------------------------------
12/12/2020   | pr_1  |  a  | 100.0
12/12/2020   | pr_2  |  b  | 200.0
13/12/2020   | pr_1  |  d  | 100.0
14/12/2020   | pr_1  |  t  | 100.0
...

您可以使用 cross join 然后使用 left join 为所有 product/date 组合生成一行。我怀疑你想要这样的东西:

select p.product, d.purchase_date,
       sum(t.revenue) as revenue_on_date,
       sum(sum(t.revenue)) over (partition by product order by d.purchase_date) as cumulative_revenue
from (select distinct product from t) p cross join
     (select distinct purchase_date from t) d left join
     t
     on p.product = t.product and
        d.purchase_date = t.purchase_date
group by p.product, p.purchase_date;

注意:这假设每天至少有一次购买。否则,对于您关心的范围内的所有日期,您可能需要其他来源。