在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...