#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.