Агрегированное скользящее окно для улья

#sql #hive #hiveql #sliding-window

#sql #улей #hiveql #скользящее окно

Вопрос:

У меня есть таблица hive, которая находится в отсортированном порядке на основе числового значения, например, count.

 fruit   count
------  -------
apple   10
orange  8
banana  5
melon   3
pears   1
  

Общее количество равно 27. Мне нужно, чтобы оно было разделено на три сегмента. Таким образом, первая 1/3 числа, т. Е. от 1 до 9, равна единице, от 10 до 18 — второму, а от 19 до 27 — третьему.
Я думаю, мне нужно сделать некоторые попытки скользящего окна.

 fruit   count    zone
------  ------- --------
apple   10      one
orange  8       two
banana  5       three
melon   3       three
pears   1       three
  

Есть идеи, как подойти к этому

Комментарии:

1. Какими были бы результаты, если бы первое число было равно 50? (То есть более 2/3 от общего значения.)

Ответ №1:

Способом SQL:

 select *,
(
sum(count)  over (partition by 1 order by count desc) /*<---this line for return running totals*/
/(sum(count) over (partition by 1) /3) /*<-- divided total count into 3 group. In your case this is 9 for each zone value.*/
) /*<--using running totals divided by zone value*/
  /*<-- 11 / 9 = 1 ... 2  You must plus 1 with quotient to let 11 in the right zone.Thus,I use this   operator  */
(
case when 
(
sum(count)  over (partition by 1 order by count desc)
%(sum(count) over (partition by 1) /3) /*<--calculate remainder */
) >1 then 1 else 0 end /*<--if remainder>1 then the zone must  1*/
)  as zone
from yourtable
  

Комментарии:

1. что означает оператор ?

2. @JohnConstantine 18 и 23, разделенные на 9, равны 2. 23 принадлежат зоне 3. Поскольку в вашем примере 10 принадлежат зоне 1, я использую оператор для добавления 1, когда остаток > 1. Если вы хотите, чтобы 10 принадлежали зоне 2, вы добавляете 1, когда остаток >0.