最近在弄新組用戶畫像標籤(特徵)工程,需要提取用戶一些標籤排序前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有什麼不同,看下圖。。。