您的位置:首页 > 数据库

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

2014-12-17 09:32 776 查看
统计分析及建表过程中通常会遇到这样的需求,比如:

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,对日常的统计分析工作,快速验证数据准确性,快速展现设计结果,甚至对产品优化改进都很有帮助,

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息