hive 分组 top10 sql简化实现方法

SELECT cityname ,cnt 
FROM (
SELECT 
 cityname 
,COUNT(1) AS cnt 

,row_number() over(ORDER BY COUNT(1) DESC ) AS rn 
FROM tmp_thd_user_list 
GROUP BY cityname 
) t 
WHERE rn <= 10 

 

好多报表都要去top10展示,在写sql的时候发现需要一层套一层,一层套一层,至少需要套三层以上;然后就在想,这个sql能不能精简一下?看着更加清晰一些呢?
我们来看一个简单的例子,表数据如下:
在这里插入图片描述
需求是看城市用户数的top10
按正常的思路,是先按城市分组统计人数,然后用开窗函数做排名,再然后取排名前10。
通过这个思路写出的sql

SELECT 
     cityname 
    ,cnt 
FROM (
	SELECT 
		 cityname 
		,cnt 
		,row_number() over(ORDER BY cnt DESC ) AS rn 
	FROM (
		SELECT cityname ,COUNT(1) AS cnt 
		FROM tmp_thd_user_list 
		GROUP BY cityname 
	) t 
) tt 
WHERE rn <= 10 
;

运行结果:
在这里插入图片描述
这里的sql套了2层,如果实际工作中遇到去重、数据过滤等等之类的各种情况,至少要套3层以上,那这里考虑如何进行代码优化呢?
关键点是在分组的时候直接用开窗函数:

SELECT cityname ,cnt 
FROM (
SELECT 
 cityname 
,COUNT(1) AS cnt 
,row_number() over(ORDER BY COUNT(1) DESC ) AS rn 
FROM tmp_thd_user_list 
GROUP BY cityname 
) t 
WHERE rn <= 10 


这里的例子看上去很简单,其中的亮点是在分组的时候直接运用开窗函数。
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值