基于条件的窗口求和:用Window Function计算用户2020年营收总和
如何用窗口函数计算特定年份的用户营收总和?
没问题,你完全可以用窗口函数实现这个需求!你之前的写法问题出在分区条件上,导致2019年的行只能计算当年的营收总和,而不是我们想要的2020年的用户总营收。
正确的SQL语句
select *, sum(case when year = 2020 then revenue else 0 end) over (partition by userid) as 2020_user_revenue from table
逻辑解释
partition by userid:按用户ID分区,确保同一个用户的所有行都在同一个计算分组内sum(case when year = 2020 then revenue else 0 end):在求和时仅统计年份为2020的营收数据,其他年份的营收按0处理,这样最终得到的就是该用户2020年的总营收,并且会填充到该用户的每一行数据中
执行结果
执行上述SQL后,就能得到你期望的结果:
| year | userid | orderid | revenue | 2020_user_revenue |
|---|---|---|---|---|
| 2019 | 1 | a1 | 50 | 150 |
| 2020 | 1 | a2 | 100 | 150 |
| 2020 | 1 | a3 | 50 | 150 |
| 2019 | 2 | b1 | 100 | 100 |
| 2020 | 2 | b2 | 100 | 100 |
为什么你之前的写法不对?
你之前的sum(revenue) over (partition by year, userid)是按年份+用户ID分区,这会把同一用户的2019年和2020年数据分成两个独立的分组,所以2019年的行计算的是该用户2019年的营收总和,而非我们需要的2020年总和。通过调整分区条件并加入条件求和,就能精准获取特定年份的用户总营收啦。
内容的提问来源于stack exchange,提问作者conley
相关产品推荐
相关产品推荐

