我的桌子有以下(部分)结构:
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
我尝试使用自加入方法,但没有成功。
任何帮助将不胜感激。
答案 0 :(得分:0)
如果您想要所有组合,则需要执行完全连接,具体取决于您可能需要设置以下属性的Hive配置
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可能需要几个时间..
更新: 更新使用窗口功能的答案,然后选择多列以获得最高分数
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;