基于2列组合选择行

0md85ypi  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(201)

我有一个具有以下(部分)结构的表:

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方法,但没有成功。
任何帮助都将不胜感激。

p1tboqfb

p1tboqfb1#

如果需要所有组合,则需要执行完全联接,这取决于您的配置单元配置,您可能需要设置以下属性

set hive.mapred.mode=nonstrict

此查询适用于您的案例。演示:

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;

结果

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

顺便说一句,根据您的数据大小和id的分布情况,fulljoin可能需要一些时间。。
更新:更新答案以使用窗口函数alllowing为最大分数选择多个列

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;

相关问题