Запрос Hive: для вычисления максимального значения индикатора на основе приоритета и даты

#sql #hive #hiveql #impala

#sql #улей #hiveql #impala

Вопрос:

Я попытался сформулировать запрос, но почему-то не получил требуемого результата, следовательно, опубликовал. Я новичок в hive. Прошу прощения, если это очень просто.

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

 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, пустая строка)

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

Вывод вышеуказанного набора данных

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

Здесь ind1 — это max (ind1) . Я могу вывести. Но не удается вывести ind2.

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

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

1. Логика не ясна. Пожалуйста, назовите индикатор в логике, описанной в соответствии с названиями столбцов в исходных данных. Какой столбец вы вычисляете и почему выводится только одна строка? Опишите агрегацию, пожалуйста. Что такое столбец Ik

2. Здравствуйте, сэр, спасибо, что указали детали. Теперь я обновил формулировки проблемы. Спасибо

Ответ №1:

 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