Hive--數據去重及row_number()

distinct會整條數據去重,有一項是不同的整條數據就算不同的,不會去掉,按照某一個字段去重需要如下方法

hive數據去重,並根據需求取其中一條
數據案例:
name adx tran_id cost ts
ck 5 125.168.10.0 33.00 1407234660
ck 5 187.18.99.00 33.32 1407234661
ck 5 125.168.10.0 33.24 1407234661
只需要前兩行的記錄,因爲第三行的tran_id和第一行的重複了,所以需要將最後面一行重複的去掉。

方案一:

selectt1.tran_id,t2.name,t2.cost 

from (selectdistinct tran_id from table) t1

join table t2 ont1.tran_id=t2.tran_id

分析:
如果使用distinct的話,需要把tran_id放在第一列,查出來的數據很不友好。

方案二:

select* 

 from(

        select *,row_number() over (partitionby tran_idorder by timestamp asc) num from table

  ) t 

wheret.num=1; 

分析:

row_number()over (partition by tran_idorder by timestamp desc) num 取num=1 的
意思是先根據tran_id進行分組,並在分組內部按timestamp 降序排序,row_number()函數計算的值就表示某個tran_id組內部排序後的順序編號(該編號在一個組內是連續並且唯一的) 。
所以最後直接去每個分組內的第一個(num=1)即可。

PS:

ROW_NUMBER() OVER函數的基本用法
語法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
簡單的說row_number()從1開始,爲每一個分組記錄返回一個數字,這裏的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再爲降序以後的每條xlh記錄返回一個序號。
示例:
xlh row_num
1700 1
1500 2
1085 3
710 4

row_number() OVER (PARTITION BY COL1 ORDERBY COL2) 表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序後的順序編號(該編號在組內是連續並且唯一的) 。

實例:

數據顯示爲
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 deptidORDER BY salary desc) rank FROM employee 

轉載自:https://blog.csdn.net/yimingsilence/article/details/70140877

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章