当前位置:数据库 > SQLServer >>

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

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  
 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,