1.要解决的问题
相对用一次请求得到的item的粗排进行排序,平时得到的粗排结果是[0,1]之间的一个值,但是想将其转换为index的形式。
2.解决方案
hive中的函数row_number()
使用方法:
select COLUMN_A,COLUMN_B,
row_number() OVER (partition BY COLUMN_A ORDER BY COLUMN_B ASC/DESC) rn
from table
rn 是排序的别名执行时每组的编码从1开始
partition by:类似hive的建表,分区的意思;COLUMN_A 是分组字段
order by :排序,默认是升序,加desc降序;COLUMN_B 是排序字段
在分组内,进行排序。
3.结果
分析:
针对我的这个问题,COLUMN_A字段就表示一次请求,对一次请求召回的item粗排的结果,排序依据是按照COLUMN_B,就是粗排的得分,产生的结果是rn。
左边一列是得分,右边一列是排序结果:
问题:如果order by中的col2中元素相同,怎么序号怎么标注?
答:仍然按照顺序排列,但是每次运行的结果都不一样,比如:
col1 | col2 | col3 | rn | col1 | col2 | col3 | rn | |
q1 | 22 | a | 1 | q1 | 22 | b | 1 | |
q1 | 22 | b | 2 | q1 | 22 | a | 2 | |
q1 | 23 | c | 3 | q1 | 23 | c | 3 | |
q2 | 11 | q | 1 | q2 | 11 | q | 1 | |
q2 | 11 | w | 2 | q2 | 11 | w | 2 | |
q2 | 12 | e | 3 | q2 | 12 | e | 3 |
4.其他排序的函数
RANK() DENSE_RANK()
先来看个例子:
select province,city,
rank() over (order by people desc) rank,
dense_rank() over (order by people desc) dense_rank,
row_number() over(order by people desc) row_number
from datatable
group by province,city,people;
运行结果:
province city rank dense_rank row_number | ||
浙江 杭州 1 1 1 | ||
江苏 苏州 2 2 2 | ||
江苏 南京 3 3 3 | ||
浙江 温州 4 4 4 | ||
江苏 某市 4 4 5 | ||
浙江 宁波 6 5 6 | ||
江苏 某某市 7 6 7 | ||
浙江 嘉兴 7 6 8 |
主要注意打圈的:
row_number:顺序下来
rank:在遇到数据相同项时,会留下空位5,(第一列4,4,6)
dense_rank:在遇到数据相同项时,不会留下空位,(红框内第一列,4,4,5)