hive中使用标准sql实现分组内排序 在hive中,想要实现分组内排序,一般都是自己写udf实现oracle中分析函数row_number() over(partition)的功能,如果不使用自定义udf,仅使用标准sql实现的话,毫无性能可言,仅做实验而已。 方便起见,以下语句为oracle中语句
hive中使用标准sql实现分组内排序
在hive中,想要实现分组内排序,一般都是自己写udf实现oracle中分析函数row_number() over(partition)的功能,如果不使用自定义udf,仅使用标准sql实现的话,毫无性能可言,仅做实验而已。
方便起见,以下语句为oracle中语句,但都属于标准sql,在hive中亦可:
sql代码
create table lxw_t (user_id varchar2(20),
class varchar2(20),
score number
);
sql代码
insert into liuxiaowen.lxw_t values ('user_1','语文','90');
insert into liuxiaowen.lxw_t values ('user_1','数学','86');
insert into liuxiaowen.lxw_t values ('user_1','英语','96');
insert into liuxiaowen.lxw_t values ('user_1','体育','77');
insert into liuxiaowen.lxw_t values ('user_2','语文','88');
insert into liuxiaowen.lxw_t values ('user_2','数学','65');
insert into liuxiaowen.lxw_t values ('user_2','英语','67');
insert into liuxiaowen.lxw_t values ('user_2','体育','98');
commit;
sql代码
select x.user_id,x.class,x.score,count(1) as seq
from (
select a.*,b.score score2 from
liuxiaowen.lxw_t a ,
liuxiaowen.lxw_t b
where a.user_id = b.user_id (+)
) x
where x.score2 >= x.score --按照成绩由高到低排列
--where x.score >= x.score2 --按照成绩由低到高排列
group by x.user_id,x.class,x.score
order by 1,4
按照成绩由高到低排列的结果如下:
sql代码
user_id class score seq
user_1 英语 96 1
user_1 语文 90 2
user_1 数学 86 3
user_1 体育 77 4
user_2 体育 98 1
user_2 语文 88 2
user_2 英语 67 3
user_2 数学 65 4
按照成绩由低到高排列的结果如下:
sql代码
user_id class score seq
user_1 体育 77 1
user_1 数学 86 2
user_1 语文 90 3
user_1 英语 96 4
user_2 数学 65 1
user_2 英语 67 2
user_2 语文 88 3
user_2 体育 98 4