使用row_number編號後截斷行錯亂丟失的情況

最近在弄新組用戶畫像標籤(特徵)工程,需要提取用戶一些標籤排序前n的數據。格式如下:

 

標籤1

標籤2

標籤3

用戶編號1

0

23

12

 

。。。

。。。

。。。

新建三列作爲三個標籤數值的排名,截斷top30並輸出,類似於標籤1_rank<30 and 標籤2_rank<30 and 標籤3_rank<30

但對同一個用戶聚合所有標籤下的值後,出來後,發現每一次的運行結果都不一樣,與原表中的數據對不上。一步一步重新跑sql,發現代碼似乎也看不出什麼問題,頭疼得不行。

 

直到找了一個厲害的大佬請教,才發現原因是因爲用了row_number作爲排序函數,row_number會對相同的數字隨機排序,並從小到大編號,我的問題就在於,有很多爲0的值被隨機排序了,而我在截斷top30時用的語句是標籤1_rank<30 and 標籤2_rank<30 and 標籤3_rank<30,導致有的標籤1爲0,其他標籤不爲0的數據也被截斷了,如下表,因爲標籤1_rank爲31的用戶編號1就這麼帶着它的有效數據一起消失了。。。

 

標籤1

標籤2

標籤3

標籤1_rank

標籤2_rank

標籤3_rank

用戶編號1

0

23

12

31

1

3

 

。。。

。。。

。。。

。。。

。。。

。。。

 

後來用dense_rank代替row_number這個問題就解決了。。。

至於value,row_number, rank, dense_rank有什麼不同,看下圖。。。

 

發佈了1 篇原創文章 · 獲贊 1 · 訪問量 6225
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章