`
superlxw1234
  • 浏览: 543165 次
  • 性别: Icon_minigender_1
  • 来自: 西安
博客专栏
Bd1c0a0c-379a-31a8-a3b1-e6401e2f1523
Hive入门
浏览量:43346
社区版块
存档分类
最新评论

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

    博客分类:
  • hive
阅读更多

在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
4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics