Hive Query: рассчитать максимальное значение индикатора на основе приоритета и даты - PullRequest
1 голос
/ 26 марта 2019

Я пытался создать запрос, но каким-то образом не получил требуемый результат, поэтому отправил сообщение.Я новичок в улье.Извините, если это очень просто.

Исходные данные:

Ik - priority - ind1 - ind2 - date
1 -   A -           y -       n   -    2009/01/01
1 -   B -           n -       y  -     2019/02/09
1 -   C -          null -     (empty)- 2018/05/07
2 -   A -          null -     y -      2005/02/02
2 -   B -          null -     y -      2006/05/05
2 -   C -           n -       null -   2018/01/01

Постановка задачи

На основании приоритета и даты нам нужно будет заполнить значения индикатора (ind1 иind2) для каждого ik.

Формат выходной таблицы

Ik, ind1, ind2

Логика

Здесь группировка будет выполнена для поля ik.Таким образом, для указанного выше набора данных в выходных данных будет заполняться только одна запись.

Если для одного и того же значения ik приоритет равен A, а флаг индикатора (ind1, ind2) равен y, тогда выходные данные должны заполняться как "y".

Но если тот же ik, приоритет - A, но у индикатора нет значения "y".(возможные значения: null, n, пустая строка)

Затем из приоритета BC будет выбран последний индикатор на основе поля даты (порядок по дате - последняя группа записей по ik).

Выход вышенабор данных

Ik - ind1 - ind2
1 -    y     -   y
2 -    n    -   y

Здесь ind1 - это максимум (ind1).Я могу вывести.Но не удалось получить ind2.

Не могли бы вы помочь мне создать запрос?

1 Ответ

0 голосов
/ 26 марта 2019

Проверка ваших данных: http://demo.gethue.com/hue/editor?editor=293916

with your_table as -------use your table instead of this subquery
(
select stack(6,

1 ,'A',  'y','n',    '2009/01/01',
1 ,'B',  'n','y',    '2019/02/09',
1 ,'C', null,'' ,    '2018/05/07',
2 ,'A', null,'y',    '2005/02/02',
2 ,'B', null,'y',    '2006/05/05',
2 ,'C',  'n', null,  '2018/01/01'

) as (Ik, priority, ind1, ind2, date)
) -------use your table instead of this subquery

select ik, 
       max(case when priority ='A' and ind1='y' then 'y' else last_ind1 end) ind1,
       max(case when priority ='A' and ind2='y' then 'y' else last_ind2 end) ind2
from
(
select Ik, priority, ind1, ind2, date,
       last_value(ind1) over (partition by Ik order by date) last_ind1,
       last_value(ind2) over (partition by Ik order by date) last_ind2
  from your_table -------use your table instead 
)s
group by ik;

Результат:

ik  ind1    ind2
1   y   y
2   n   y
...