Hive - выборка накопленной суммы с условием предыдущего значения столбца - PullRequest
1 голос
/ 01 мая 2019

Таблица ввода t1:

enter image description here

Требуется вывод:

enter image description here

Подробное описание: Если значения fg и x равны «Carry», тогда значение z должно быть равно вычисленному значению z для предыдущей строки + 1. Иначе z должно быть равно 0. Как в примере, для первой строкимы рассматриваем предыдущее вычисленное значение z как 0, а затем увеличиваем его на 1, так как fg и x равны «Carry».

Во второй строке и fg, и x равны «Carry», и вычисленное значениепредыдущий ряд равен 1, а увеличение его на 1 дает 2.

В третьем ряду, поскольку fg и x оба не равны "Carry", поэтому значение z равно 0.

Я пытался использоватьФункции SUM (), LAST_VALUE () и т. Д., Но в этом случае, похоже, ничего не работает.Я в основном пытаюсь воспроизвести сохранение функции SAS в HIVE.Любая помощь приветствуется.

Примечание. Заказ осуществляется с использованием столбца id.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Вы должны создать переменную и проверить, равны ли fg и x Carry , затем увеличьте значение переменной, иначе присвойте ей значение 0.

SELECT id, fg, x, if(fg='Carry' and x = 'Carry', @a:=@a+1, @a:=0) as z from t1, (SELECT @a:= 0) as a;
0 голосов
/ 01 мая 2019

Вы можете определить группы, используя накопленную сумму. Затем используйте row_number(). В следующем коде ? для столбца, который определяет порядок:

select t.*,
       (case when fg = 'Carry' and x = 'Carry'
             then row_number() over (partition by id, grp, fg, x order by ?)
             else 0
        end) as z
from (select t.*,
             sum(case when fg = 'Carry' and x = 'Carry' then 0 else 1 end) over (partition by id order by ?) as grp
      from t
     ) t;

Здесь - это дБ <> скрипка. Обратите внимание, что здесь используется Postgres вместо Hive, но это не должно иметь значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...