在 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;
注意:这假设每天至少有一次购买。否则,对于您关心的范围内的所有日期,您可能需要其他来源。
所以我的问题是,为了清楚起见,我有来自 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;
注意:这假设每天至少有一次购买。否则,对于您关心的范围内的所有日期,您可能需要其他来源。