Сгруппировать по одному столбцу и выбрать несколько столбцов в кусте - PullRequest
1 голос
/ 12 февраля 2020

У меня есть данные в таблице Hive, как показано ниже.

Таблица 1:

ID CODE VALUE  

1  XXXX 100  
2  AAAA 200
1  YYYY 300  
3  DDDD 300  
4  BBBB 200  
2  CCCC 300  
3  HHHH 200

Мне нужно выбрать ID, VALUE из таблицы 1 и загрузить в таблицу 2. После таблицы 1 имеет повторяющиеся идентификаторы, я должен получить уникальные строки из таблицы 1 на основе данных в поле CODE.

порядок выбора строк из таблицы 1 является первым приоритетом, который будет отдан CCCC, затем XXXX затем AAAA и т. д.

Я ожидаю, что в таблице 2 будут данные, подобные ниже-

ID VALUE  
1   100
2   300  
3   300  
4   200

1 Ответ

0 голосов
/ 13 февраля 2020

Вы можете определить приоритет в операторе CASE. Назначьте приоритеты каждому КОДУ или списку кодов. Приоритет, рассчитанный в CASE, будет использоваться для упорядочивания внутри ID-раздела перед нумерацией строк функцией row_number anality c. Строки с одинаковым идентификатором и одинаковым приоритетом будут упорядочены случайным образом, поэтому лучше попытайтесь определить приоритеты для всех кодов. Смотрите комментарии в коде:

with your_data as ( --Use your table instead of this CTE
select stack(7,
1,'XXXX',100, 
2,'AAAA',200,
1,'YYYY',300, 
3,'DDDD',300, 
4,'BBBB',200, 
2,'CCCC',300, 
3,'HHHH',200
) as (ID,CODE,VALUE)
)

select ID, VALUE 
from
(
select ID,CODE,VALUE,
       row_number() over(partition by ID order by case when CODE='CCCC' then 1 --define priority here
                                                       when CODE='XXXX' then 2
                                                       when CODE='AAAA' then 3
                                                       when CODE='DDDD' then 4
                                                       when CODE='HHHH' then 5
                                                       --and so on... add more cases
                                                       else 99  --default priority
                                                    end) rn
  from your_data d
)s
where rn=1 --remove duplicates  
;

Результат:

OK
1       100
2       300
3       300
4       200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...