今天遇到一个问题, 对用户操作信息表,搜索出每个用户的最近10条操作信息,注意:1、最近,也就是按照时间倒排,取出前2条;2、每个用户。
左思右想,实在找不到好办法,后来请教大师,天空飘来五个字儿---使用窗函数。
select * from ( select user_id , time , rank() over ( PARTITION by user_id order by time desc) as rank_num from wfp_topn_test ) a where a.rank_num <= 2;;
首先这里几个概念,我也第一次用到,窗函数 和 PARTITION, PARTITION by field_name,会把表 按照 field_name字段划分成好几张小表,每个表 field_name的字段值相同,类似于group by,但不同的是,group by是将 field字段相同的记录,变成一条记录。
distribute by 和 partition by的区别: distribute by field,是按照field字段值,进行分区,给reduce,个人认为,纯粹是一种mr优化手段,distribute by field 会保证 : field字段值相同的记录在同一个 reduce。
rank 和 DENSE_RANK()的区别, rank 不留空位, DENSE_RANK 反之。