数据统计分析时常用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列经常是这样的
2. 分组排序url的pv, 取topN的列表
3. 经常会有名字重复的url记录,要取pv最大的那条, 剩下的剔除
方法1:在没有row_number函数的情况下:
方法2:在有row_number函数的情况下:
经测试,方法2要快很多(因为没有了求max 和 join的操作)
sql作为流行的查询语言,不管是hive, 还是spark, 都对sql有很好的支持,
与此同时,像item based推荐等复杂一些的模型算法,也可以通过sql的方式很方便地解决,
楼主感觉掌握好sql,对日常的统计分析工作,快速验证数据准确性,快速展现设计结果,甚至对产品优化改进都很有帮助,
所以大家一起努力学习吧:)
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,对日常的统计分析工作,快速验证数据准确性,快速展现设计结果,甚至对产品优化改进都很有帮助,
所以大家一起努力学习吧:)
相关文章推荐
- 常用的一些数据统计SQL语句
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- [Oracle]高效的SQL语句之分析函数--row_number() /rank()/dense_rank()
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- SQL 数据分析常用语句
- 常用的一些数据统计SQL语句
- Excel 中使用SQL 语句查询数据(八)-----用Group by 进行分组统计
- SQL 2005 ROW_NUMBER() 语句分页 | SQL效率最高的分页查询数据
- 【一文打尽】SQL 数据分析常用语句
- PostgreSQL源码分析(2)– 常用数据类型/SQL语句的解释和执行
- C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序
- SQL语句技巧:按月统计数据
- SQL语句技巧:按月统计数据
- 常用的数据库统计SQL语句
- 只满足某个条件的数据统计SQL各类写法性能分析
- 统计数据方面的Transact-SQL查询语句
- SQL 2005 ROW_NUMBER() 语句分页