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

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

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:php中文网

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值