Выберите строки на основе комбинации 2 столбцов - PullRequest
0 голосов
/ 30 мая 2018

У меня есть таблица со следующей (частичной) структурой:

id_1 score_1 id_2 score_2
77    10    88   50
77    10    88   30
77    25    88   50
77    25    88   30

, что означает, id может получить более одного балла.
Я хочу оставить строки, гдеid комбинация с максимальным score каждого id.

В приведенном выше примере я хотел бы оставить только следующую строку:

id_1 score_1 id_2 score_2
77    25    88   50

Я пытался использовать self-join методы, но снет успеха

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 30 мая 2018

Если вам нужны все комбинации, вам потребуется выполнить полное объединение, в зависимости от конфигурации вашего куста, вам может потребоваться установить следующее свойство

set hive.mapred.mode=nonstrict

Этот запрос будет работать для вашего случая.DEMO:

create table tmp3 
(
id_1 string, score int, id_2 string, score_2 int

);

INSERT INTO TABLE tmp3
VALUES (77, 10,    88,   50),(77  ,  10   , 88  , 30),(77  ,  25  ,  88 ,  50),(77  ,  25  ,  88 ,  30);

select a.id_1, a.score, b.id_2,b.score_2 from 
(
select id_1, max(score) as score from tmp3 group by id_1
) a
full join 
(
select id_2, max(score_2) as score_2 from tmp3 group by id_2

) b; 

result

a.id_1,a.score,b.id_2,b.score_2
77,25,88,50

Кстати, в зависимости от размера ваших данных и распределения ваших идентификаторов, полное объединение может занять несколько раз ..

ОБНОВЛЕНИЕ: Обновление ответа для использования оконной функции, позволяющей выбрать несколько столбцов для максимального количества баллов

select a.id_1, a.score, b.id_2,b.score_2 from 
(
select id_1, score from (
select id_1,  score , 
ROW_NUMBER() OVER (partition by id_1 order by score desc) AS row_num
from tmp3
) x1 where row_num = 1
) a
full join 
(
select id_2, score_2 from (
select id_2,  score_2  ,
ROW_NUMBER() OVER (partition by id_2 order by score_2 desc) AS row_num
from tmp3
) x2 where row_num = 1

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