Случай или декодирование на нескольких строках - PullRequest
0 голосов
/ 18 декабря 2018

Я должен добиться результата в HIVE из входной таблицы с заданным условием, как показано на рисунке.Возможно ли получить это в одном запросе с некоторыми функциями без добавления дополнительного столбца? enter image description here

Запросы для создания временной таблицы: -

 Create table test(`serial_no` string,`location` string, `status` string,`row_num` int);
     INSERT INTO test values('ABC','CA','S',1);
     INSERT INTO test values('ABC','CA','P',2);
     INSERT INTO test values('ABC','CA','F',3);

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Используйте агрегирование min () или max () с оператором case:

 select serial_no, location, 
        max(case when (row_num=1 and status='S') OR ( row_num=2 and status='P') then 'Passed' end) result 
   from test 
  group by serial_no, location;

Результат:

OK
serial_no       location        result
ABC             CA              Passed
Time taken: 61.036 seconds, Fetched: 1 row(s)
0 голосов
/ 18 декабря 2018

Вы также можете попробовать ниже, используя функцию collect_list, а затем применить group by.Я не проверял производительность, и вы можете посмотреть на маппер, используемый в этом случае.

select  serial_no,  uslocation , 
case when 
collect_list(condition_1)[0] = 1 and 
collect_list(condition_2)[0] = 'S' and 
collect_list(condition_3)[0] = 2 and 
collect_list(condition_4)[0] = 'P'
then 'Passed' else 'Failed' end result_field
from 
(
select
serial_no,
uslocation,
CASE WHEN row_num=1 THEN row_num END AS condition_1,
CASE WHEN status='S' THEN status END AS condition_2,
CASE WHEN row_num=2 THEN row_num END AS condition_3,
CASE WHEN status='P' THEN status END AS condition_4
from 
test_tbl
) dummy_tble
group by serial_no, uslocation

Result before applying case statement

Result from cloudera hive console

0 голосов
/ 18 декабря 2018

попробуй

select distinct a.serial_no, a.location, case when S = P then 'passed' end result
   from(
        select serial_no, location,
        case when row_num = 1 and status = 'S' then 1 else 0 end S
        from test) a
   inner join (
        select serial_no, location,
        case when row_num = 2 and status = 'P' then 1 else 0 end P
        from test) b 
   on a.serial_no = b.serial_no and b.location = b.location and p <> 0 and s <> 0
 ;
...