最近遇到比较多的数仓面试题。
已知shop_id,item_id,num_id三列,使用hive sql计算得到a、b列.
首先我们观察一下表,分析一下a列数据.
我们发现a列的值都是小数且小于1,估计应该就是某些占比。再仔细观察,发现当shop_id相同的时候,a列的值相加为1,验证了我们的推测。然后我们再发现这个比值是num列在一个分组下占num总和的百分比,而后面的b列就是a列在同个分组的排名。
分析完需求后,我们就可以着手写hql语句。里面的排名可以用到开窗函数。
Select shop_id,item_id,num
Num/sum(num) over(distrinute by shop_id rows between 1 preceding and 2 following)a,
Rank()over (distrinute by shop_id_)b;
接下来看第二题,我们看到一列中有多个数据,很明显可以使用行转列函数lateral view.
Select item,num,
Sum(c1) as sum
From t later view explode(num) t1 as c1
Group by item,num;