hive中使用标准sql实现分组内排序

在hive中,想要实现分组内排序,一般都是自己写udf实现oracle中分析函数row_number() over(partition)的功能,如果不使用自定义udf,仅使用标准sql实现的话,毫无性能可言,仅做实验而已。

 

方便起见,以下语句为oracle中语句,但都属于标准sql,在hive中亦可:

 

CREATE TABLE lxw_t (user_id VARCHAR2(20),
class VARCHAR2(20),
score NUMBER 
);

 

 

 

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;

 

 

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 

 

按照成绩由高到低排列的结果如下:

 

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

 

按照成绩由低到高排列的结果如下:

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值