如何在sql/bigquery中获取消耗但不超过总预算的每日预算

blmhpbnm  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(268)

这里我有每日预算和总预算。每日预算是总预算的一部分
每次点击成本(cpc)$1
总预算1000美元
每日上限150美元
下面是所需的表格

Select  'pubg'  app_pkg,    100 as Click,   1 as CPC,   150 as Daily_budget,    1000 as Total_budget union All
Select  'pubg'  ,   125 ,   1,  150,    1000,   union All
Select  'pubg'  ,   150 ,   1,  150,    1000,   union All
Select  'pubg'  ,   175 ,   1,  150,    1000,   union All
Select  'pubg'  ,   200 ,   1,  150,    1000,   union All
Select  'pubg'  ,   225 ,   1,  150,    1000,   union All
Select  'pubg'  ,   250 ,   1,  150,    1000,   union All
Select  'pubg'  ,   275 ,   1,  150,    1000,   union All
Select  'pubg'  ,   300 ,   1,  150,    1000,   union All
Select  'pubg'  ,   325 ,   1,  150,    1000

我想要这个格式的结果

app_pkg Clicks  Daily_rev
pubg    100     $100
pubg    125     $125
pubg    150     $150
pubg    175     $150
pubg    200     $150
pubg    225     $150
pubg    250     $150
pubg    275     $25
pubg    300     $0
pubg    325     $0

每日收入不超过每日预算,总和(每日收入)等于总预算。

xxls0lw8

xxls0lw81#

下面是bigquery标准sql


# standardSQL

SELECT app_pkg, Click,
  GREATEST(0,
    LEAST(
      total_budget - IFNULL(SUM(LEAST(click * cpc, daily_budget)) OVER(PARTITION BY app_pkg ORDER BY click ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0),
      LEAST(click * cpc, daily_budget)
    )
  ) AS daily_rev
FROM `project.dataset.table`
-- ORDER BY click

当应用于问题的样本数据时-输出是

Row app_pkg Click   daily_rev    
1   pubg    100     100  
2   pubg    125     125  
3   pubg    150     150  
4   pubg    175     150  
5   pubg    200     150  
6   pubg    225     150  
7   pubg    250     150  
8   pubg    275     25   
9   pubg    300     0    
10  pubg    325     0
dy1byipe

dy1byipe2#

你想要一个累积的总和。我猜你想从最小的点击到最大的点击。逻辑如下:

select t.*,
       greatest(least(total_budget - sum(least(click * cpc, daily_budget)) over (partition by app_pkg order by click),
                      least(click * cpc, daily_budget)
                     ), 0
               ) as daily_rev
from t
order by click;

一些解释。表达式:

least(click * cpc, daily_budget)

根据每日限额计算当日收入。
然后 daily_rev 有点复杂。使用每日收入的累计总和。首先,如果累计和很容易符合总数,则使用日限值。否则,总值和累积值之间的差值。
对于某些行,差异可能为负。这些都是上限 0 使用 greatest() .

相关问题