我想做一个特殊的查询来评估团队成员。每个成员都有一个分数,分数大于该团队分数的80%的成员将获得奖金。但是,我想添加一个条件,以便仅基于> 0的那些分数来计算第80个百分位数。
例如,如果团队A有
[0, 0, 0.6, 0.6, 0.8, 0.8]
然后将使用
计算百分位数[0.6, 0.6, 0.8, 0.8]
,结果将为0.8。否则,如果团队的分数仅为0,则team_80th_score将为0。
该表如下所示,team_80th_score *是所需的结果。
team| member | score | team_80th_score*
----+-----------+------+--------
A | Alex | 0 | 0.8
A | Abby | 0 | 0.8
A | Hunt | 0.6 | 0.8
A | Tyler | 0.6 | 0.8
A | Jack | 0.8 | 0.8
A | Mile | 0.8 | 0.8
B | John | 0 | 0
B | Amy | 0 | 0
B | Alice | 0 | 0
我使用Hive SQL,并且了解在此基本窗口功能上构建是必经之路
select team, member, score,
percentile_approx(score, 0.8) over (partition by team) as team_80th_score
from table;
但是我不知道如何包括仅考虑得分> 0的条件(对于像A团队这样的情况),并且如果按组分组的sum(score)为0,那么0结束时就是team_80th_score(对于像这样的情况) B组)。
在这种情况下,您会建议我做什么?
答案 0 :(得分:0)
嗯。 。 。一种方法是在score = 0
中包括逻辑。请注意,这在select team, member, score,
percentile_approx(score, 0.8) over (partition by team, (case when score > 0 then 1 else 0 end) as team_80th_score
from table;
时返回无意义的值:
case
要解决此问题,请使用外部select team, member, score,
(case when score > 0
then percentile_approx(score, 0.8) over (partition by team, (case when score > 0 then 1 else 0 end))
end) as team_80th_score
from table;
表达式:
{{1}}