如何在SQL Percentile Window函数上添加条件?

时间:2019-01-25 14:14:07

标签: mysql sql hive window-functions partition

我想做一个特殊的查询来评估团队成员。每个成员都有一个分数,分数大于该团队分数的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组)。

在这种情况下,您会建议我做什么?

1 个答案:

答案 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}}