一、row_number()
1、語法:
row_number() over (partition by col_list1 order by col_list2)
rank() over(partition by col_list1 order by col_list2)
2、row_number() over (partition by col_list1 order by col_list2)
首先根據col_list1分組,在分組內部根據col_list2排序,row_number()函數計算的值表示每組內部排序后的順序編號,組內連續的唯一的;例子:
數據顯示為 empid deptid salary ----------- ----------- --------------------------------------- 1 10 5500.00 2 10 4500.00 3 20 1900.00 4 20 4800.00 5 40 6500.00 6 40 14500.00 7 40 44500.00 8 50 6500.00 9 50 7500.00 需求:根據部門分組,顯示每個部門的工資等級 預期結果: empid deptid salary rank ----------- ----------- --------------------------------------- -------------------- 1 10 5500.00 1 2 10 4500.00 2 4 20 4800.00 1 3 20 1900.00 2 7 40 44500.00 1 6 40 14500.00 2 5 40 6500.00 3 9 50 7500.00 1 8 50 6500.00 2 SQL腳本: SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee
也可以不限分組,直接進行排序:
row_number() over (order by col_list2 decs) as 新列名,例子:
123
3、rank()
rank() over()函數則是跳躍排序,序號不唯一,即當有數據值值相同時,並列,當遇到不同的數據,其序號為上一個數據的序號加上該序號的個數。如兩個並列第一,序列號為(1,1,3.......)
二、Join的類型和用法
Hive中除了支持和傳統數據庫中一樣的內關聯、左關聯、右關聯、全關聯,還支持LEFT SEMI JOIN和CROSS JOIN,但這兩種JOIN類型也可以用前面的代替。
注意:Hive中Join的關聯鍵必須在ON ()中指定,不能在Where中指定,否則就會先做笛卡爾積,再過濾。
hive> select * from lxw1234_a; OK 1 zhangsan 2 lisi 3 wangwu Time taken: 0.116 seconds, Fetched: 3 row(s)
hive> select * from lxw1234_b; OK 1 30 2 29 4 21 Time taken: 0.09 seconds, Fetched: 3 row(s)
10.1 內關聯(JOIN)
只返回能關聯上的結果。
- SELECT a.id,
- a.name,
- b.age
- FROM lxw1234_a a
- join lxw1234_b b
- ON (a.id = b.id);
- --執行結果
- 1 zhangsan 30
- 2 lisi 29
其他用法參考:
[一起學Hive]之十一-Hive中Join的類型和用法