Как добавить условия в функцию SQL Percentile Window? - PullRequest
0 голосов
/ 25 января 2019

Я хочу сделать специальный запрос для оценки членов команды.Каждый участник получит оценку, а те, кто наберет более 80-го процентиля от оценки этой команды, получат бонус.Однако я хочу добавить условие, чтобы оценка 80-го процентиля вычислялась только на основе этих показателей> 0.

Например, если команда А имеет

[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 

Я использую HiveSQL, и поймите, что построение на этой фундаментальной оконной функции будет способом пойти

select team, member, score, 
percentile_approx(score, 0.8) over (partition by team) as team_80th_score
from table;

Но я не знаю, как включить условия, чтобы просто считать счет> 0 (для случая, подобного команде А)), и если сумма (оценка) для группы по команде равна 0, тогда 0 заканчивается как team_80th_score (для случая, подобного команде B).

Что бы вы порекомендовали мне сделать в этом случае?

1 Ответ

0 голосов
/ 25 января 2019

Хмммм.,,Одним из методов является включение логики в partition by.Обратите внимание, что это возвращает бессмысленные значения, когда 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...