数据统计分析时常用sql语句 (split , row_number , group by, max 等 )

本文介绍了在数据统计分析中,如何使用Hive SQL处理以逗号分隔的标签计数、分组排序URL取TopN以及处理重复URL记录的问题。分享了两种方法,强调了row_number函数在提高效率上的优势,同时指出掌握SQL对于数据分析、数据验证和产品优化的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


统计分析及建表过程中通常会遇到这样的需求,比如:

1. 统计以逗号分隔的标签数,哪个最受欢迎,以及作为内容推荐的数据来源

2. 分组排序url的pv, 取topN的列表

3. 经常会有名字重复的url记录,取pv最大的那条, 剩下的剔除

 

下面逐一对以上场景进行总结, 用的是 hivesql,希望有同样需求的同学可以快速应用,如果有不对的地方还请指正:) 

 

1. 统计以逗号分隔的标签数,哪个最受欢迎

hive表中tag列经常是这样的

--统计以逗号分隔的tags的分布

--其中tags是你打算展开的原先以逗号分隔的那一列,
--tags_split 是展成多行后的每个tag组成的列, 
--alias是别名,可以自己任意定
--然后group by, 统计个数分布 

select tags_split,count(*) as n from 
(
select tags_split 
from table1
LATERAL VIEW explode(split(tags,",")) alias AS tags_split
where date = '20141119'
)a
group by tags_split
order by n desc;

 

2. 分组排序url的pv, 取topN的列表

 

--首先统计下pv大于100的url及对应的pv


select url, url_name, host, count(*) as pv 
from table1 a
where date = '20141119'
group by url, url_name, host
having count(*) > 100

 


--如果还想按同一域名下url取pv倒序后的top20,可以这样写

select * 
from 
(
select *, 
ROW_NUMBER ( ) OVER (partition by host order by pv desc)  as host_pv_rank  
from
(
select url, url_name, host, count(*) as pv 
from table1 a
where date = '20141119'
group by url, url_name, host
having count(*) > 100
)a 
)a 
where host_pv_rank <= 20 
order by host_pv_rank;

 

3. 经常会有名字重复的url记录,要取pv最大的那条, 剩下的剔除

 
方法1:在没有row_number函数的情况下:

select 
source.*,
case when dup.pv_max is null then 0 else 1 end as no_dup_flag 
--如果找不到即为重复的,只有最大的那个是1

from 
(
select url, url_name, count(*) as pv 
from table1 a
where date = '20141119'
group by url ,url_name
having count(*) > 100
)source 

left outer join 
(
select url_name, max(pv) as pv_max from 
(
select url, url_name, count(*) as pv 
from table1 a
where date = '20141119'
group by url, url_name
having count(*) > 100
)a 
group by url_name
)dup

on source.url_name = dup.url_name
and source.pv = dup.pv_max  

--与最大的那条记录通过 url_name
--与最大那条的pv进行关联,只有url_name与pv同时相等才能关联得上
--否则就是重名的但pv小的记录,我们这里将重复的记录标记出来

 

方法2:在有row_number函数的情况下:


select 
source.*,
ROW_NUMBER ( ) OVER (partition by url_name order by pv desc)  as dup_flag
-- dup_flag > 1 即为重复的
from 
(
select url, url_name, count(*) as pv 
from table1 a
where date = '20141119'
group by url ,url_name
having count(*) > 100
)source 

 经测试,方法2要快很多(因为没有了求max 和 join的操作)

sql作为流行的查询语言,不管是hive, 还是spark, 都对sql有很好的支持,

与此同时,像item based推荐等复杂一些的模型算法,也可以通过sql的方式很方便地解决,

楼主感觉掌握好sql,对日常的统计分析工作,快速验证数据准确性,快速展现设计结果,甚至对产品优化改进都很有帮助,

所以大家一起努力学习吧:)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值