hive中使用標準sql實現分組內排序

2021-09-01 17:28:06 字數 1732 閱讀 3725

在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

在Axapta中使用標準SQL

雖然axapta當中的sql statement提供了強大的功能,但是由於與整體的功能設計有衝突 如table可以作為變數 axapta省去了一些標準的sql關鍵字,如union,distinct等。那麼我們想使用的話,那怎麼辦呢?我們可以利用statement這個類在axapta中執行標準的sql...

Hive中使用sql的注意事項

一 別名的使用 1 定義別名 columna as x 不需要使用單引號 2 使用別名 不與where同時使用 花式報錯 有說hive不支援where後使用別名 二 group by select m.makename sum c from select t.makeid as id count o...

shell中使用SQL實現查詢

先把文字進行格式處理,然後以空格為分隔符,取第二個空格後的字串,排序,去重,再降序排列,取前5個 arr cat 0100055f detail.txt sed e d awk f sort uniq c sort nr head 5 awk len 獲取陣列長度 for i 0 i len i d...