今天无意中碰到一个很简单的计算逻辑,但是用hive想了一大会才实现。
示例表数据:
需求逻辑:
给每条记录追加一个字段,用于统计按照p1和p2字段分组后,每个组中的num的数目(去重后的count)。
示例结果:
Mysql 超级简单的一句:
select id, num, p1, p2, count(distinct num) over (PARTITION by p1,p2) as f from test_z;
Hive里
会报distinct有问题,去掉的话,明显与要求逻辑不符合啊。
想了一会还是用 dense_rank 和 join 实现了。以后再发掘其他的简单方法吧:
select b.id, b.num, b.p1, b.p2, a.f from ( select p1, p2, max(f) as f from ( select id, num, p1, p2, dense_rank() over (PARTITION by p1, p2 order by num) as f from test_z )a1 group by p1,p2 )a join test_z b on a.p1=b.p1 and a.p2=b.p2;
上面的a表太复杂,还可以用简单的group by 和 count(distinct)把a表逻辑换了。
select p1, p2, count(distinct num) as f from test_z group by p1,p2
每天进步一点点