【发布时间】:2019-11-01 14:06:54
【问题描述】:
注意:这个问题似乎得到了不错的看法,所以我认为最好更新这个问题以清楚起见。大多数更改都是装饰性的,但唯一的主要更改是我在 weights_table 中添加了月份列。权重表是月度表,所以从技术上讲这并不重要,但我想在两个表中都有月份列会使表关系更加明显和合乎逻辑
问题
我有一个使用两个表 [person_table] 和 [weights_table] 的查询。
select
a.month,
a.movie,
count(a.person_id) as raw,
sum(b.weight) as weighted,
sum(b.weight)/sum(sum(b.weight)) over () as share -- I need to change this calculation
from (select distinct month,
movie,
person_id
from person_table) a
join weights_table b on a.month=b.month and a.person_id=b.person_id
group by a.month, a.movie;
我想要更改最后一个计算,以便将分母 sum(sum(b.weight)) over () 计算为 (distinct person_ids per month) 的权重总和,而不是 (distinct person_ids per movie per月)。有没有更简单的方法来适应这种情况而无需添加另一个子查询?
person_table 示例
+-------+-------+-----------+
| month | movie | person_id |
+-------+-------+-----------+
| 1 | a | 1 |
| 1 | b | 1 |
| 1 | b | 2 |
| 1 | a | 2 |
| 1 | c | 3 |
| 1 | d | 4 |
| 1 | a | 2 |
| 1 | c | 3 |
| 1 | a | 6 |
+-------+-------+-----------+
weights_table 示例
+-------+-----------+--------+
| month | person_id | weight |
+-------+-----------+--------+
| 1 | 1 | 12 |
| 1 | 2 | 34 |
| 1 | 3 | 65 |
| 1 | 4 | 76 |
| 1 | 7 | 96 |
+-------+-----------+--------+
预期结果
+-------+-------+-----+----------+-------+
| month | movie | raw | weighted | share |
+-------+-------+-----+----------+-------+
| 1 | a | 2 | 46 | 0.25 | --(12+34)/(12+34+65+76)=0.25
| 1 | b | 2 | 46 | 0.25 |
| 1 | c | 1 | 64 | 0.35 |
| 1 | d | 1 | 76 | 0.41 |
+-------+-------+-----+----------+-------+
指标定义:
原始:每部电影每月所有不同 person_id 的计数)
加权:每部电影每月不同 person_id 的权重总和。
分享:加权与(每月与persons_table匹配的不同person_id的权重总和)的比率
【问题讨论】:
-
样本数据和期望的结果真的很有帮助——就像定义你想要计算的指标一样。
-
让我添加它们
-
所以,如果我理解这一点。如果一个人在一个月内不止一次看同一部电影,您是否希望您的原始和加权只计算一次?但是,您希望所有这些都用于共享。对吗?
-
@MikeWalton 对于原始和加权,这是正确的,但如果同一个人观看另一部电影,则计为 2。但对于份额的分母,他们观看的电影无关紧要。我想总结当月唯一不同 person_id 的相应权重。
-
能否请您向我们展示您对该样本数据的预期结果?
标签: sql window-functions snowflake-cloud-data-platform