Функция, эквивалентная процентилю в импале

Есть ли функция, эквивалентная функции «процентиль» Hive в Impala? В основном я пытаюсь найти процентили для набора строк в моей таблице. Я попытался использовать функцию процентилей с моим запросом в Hive, но выполнение запроса и возврат результата занимает много времени.


person Pushpa Gadde    schedule 17.11.2020    source источник


Ответы (2)


Вы можете использовать подзапрос и арифметику. Например:

select t.*,
       max(case when seqnum <= p * cnt then XXX end) over () as percentile
from (select t.*,
             row_number() over (order by XXX) as seqnum,
             count(*) over () as cnt
      from t
     ) t
person Gordon Linoff    schedule 17.11.2020
comment
Спасибо, Гордон Линофф. Я получаю сообщение об ошибке AnalysisException: выберите выражение списка, не созданное выводом агрегации (отсутствует в предложении GROUP BY?): row_number() OVER (ORDER BY day1diff ASC) seqnum, когда я пытаюсь выполнить самый внутренний запрос. - person Pushpa Gadde; 17.11.2020
comment
@PushpaGadde . . . Это странное сообщение об ошибке. В этом запросе нет агрегации. - person Gordon Linoff; 17.11.2020

У меня недостаточно репутации, чтобы комментировать, поэтому я публикую ответ. Ответ Гордона Линоффа дает очень хорошее решение. Если в разделе есть только один элемент (cnt = 1), процентиль возвращает NULL. Если кто-то хочет вернуть значение этого единственного элемента, может помочь небольшое расширение решения Gordons. (Фрагмент кода также содержит разделы по столбцу).

select group_column,
   max(case when (cnt > 1 and seqnum <= p * cnt) or cnt = 1 then XXX end) 
   as percentile 
from (select t.*,
         row_number() over (partition by group_column order by XXX) as seqnum,
         count(*) over (partition by group_column) as cnt
  from t) a
group by group_column
person phantomias    schedule 04.02.2021