每天分享一个sql,帮助大家找到sql的快乐

需求:求所有用户和活跃用户的总数及平均年龄

建表语句

create table user_age(dt string,user_id string,age int
)
row format delimited fields terminated by '\t'
;

数据

insert overwrite table user_age values
("2019-02-11","test_1","23"),
("2019-02-11","test_2","19"),
("2019-02-11","test_3","39"),
("2019-02-11","test_1","23"),
("2019-02-11","test_3","39"),
("2019-02-11","test_1","23"),
("2019-02-12","test_2","19"),
("2019-02-13","test_1","23"),
("2019-02-15","test_2","19"),
("2019-02-16","test_2","19");

实现

select0 user_total_count,0 user_total_avg_age,count(*) twice_count,cast(sum(age)/count(*) as decimal(10,2)) twice_count_avg_age
from
(selectuser_id,min(age) age
from(selectuser_id,min(age) agefrom(selectuser_id,age,date_sub(dt,rk) flagfrom(selectdt,user_id,min(age) age,rank() over(partition by user_id order by dt) rkfromuser_agegroup bydt,user_id)t1)t2group byuser_id,flaghavingcount(*)>=2)t3
group byuser_id
)t4
union all
selectcount(*) user_total_count,cast(sum(age)/count(*) as decimal(10,2)),0 twice_count,0 twice_count_avg_age
from(selectuser_id,min(age) as agefromuser_agegroup by user_id)t5
;

结果


结果
OK
_u1.user_total_count    _u1.user_total_avg_age  _u1._c2 _u1._c3
0   0.0 2   19.00
3   27.0    0   0.00

分析

1、这里有两次去重,第一次去重是一个用户一天内多次访问,只算一次,第二次一个用户有多个连续登录,那么实际情况中,第一次去重是常规操作,第二次去重根据公司实际要求来做
2、活跃用户是指连续两天及以上,所以count(*)>=2
3、date_sub(dt,rank) flag这个是核心逻辑,语言不好描述,举例说明:(03-22,1)(03-27,2),(03-28,3),(03-29,4),通过日期相减后得到的值都是结果是03-21,03-25,只有03-25的结果是日期是连续的
4、这里需要计算所有用户的平均年龄和活跃用户的平均年龄,维度不同,在不同的列展示,而union all需要保证列数相同,所以这里需要补默认值

扩展

min(age)作用:
1、满足分组时把age从子查询带出
2、用户每天登录,年龄可能会随着日期变化,所以潜在的计算规则中是每次根据用户和日期分组时取最小年龄

知识点

1、date_sub(日期,数值)表示用日期-数值,返回日期字符串
2、cast(数据类型1 as 数据类型2)表示将数据类型1强转成数据类型2
3、decimal(10,2)是整数位长度为10,小数位长度为2,如果没有小数位,默认补0

hive sql系列(三)——求所有用户和活跃用户的总数及平均年龄相关推荐

  1. hive sql系列(二)——统计每个人每个月访问量和累计月访问量

    每天分享一个sql,帮助大家找到sql的快乐 需求:统计每个人每个月访问量和累计月访问量 建表语句 CREATE TABLE visit( userId string, visitDate strin ...

  2. hive sql趣味题-求两两的共同好友

    初始条件 给出以下两列,分别为用户和用户的好友列表,要求求两两的共同好友. user friend_list a b,c,d b c,d,e c a,f d a,e 建表 CREATE TABLE ` ...

  3. 【AD用户配置系列三】文件夹重定向为用户登录与注销加速

    在前面两篇文章中(让IT省心省力的漫游配置文件和批量修改漫游配置文件路径),跟大家介绍了漫游配置文件在企业IT基础环境管理中的使用方法.通过漫游配置文件实现了用户配置文件的集中管理:这对企业IT部门来 ...

  4. hive 学习系列三(表格的创建create-table)

    表格创建: 语法 第一种建表的形式:说明: temporary 临时表,在当前回话内,这张表有效,当回话结束,可以理解为程序结束,则程序终止. external 外部表, hdfs 上的表的文件,并非 ...

  5. hive sql练习_经典的SparkSQL/Hive-SQL/MySQL面试-练习题

    经典的SparkSQL/Hive-SQL/MySQL面试-练习题​mp.weixin.qq.com 第一题 需求: 已知一个表order,有如下字段:date_time,order_id,user_i ...

  6. 系统架构系列 (三):业务架构实战上篇

    引言 业务架构一般不被开发重视,开发人员喜欢追求新技术,而技术是服务于业务的,现在没有一项技术是自娱自乐的,一定要支撑业务,否则没有场景.设计好业务架构要考虑的方面比较多,要做到业务彼此隔离.业务与技 ...

  7. 安卓应用用户数据_用户指标数据应用

    一.如何理解数据 用户数据:gender:性别. birthday:出生日期 行为数据:user_id:用户id.auction_id:购买行为编号.buy_mount:购买数量.day:购买时间 商 ...

  8. 活跃用户的测算方法与用户黏性指数的提出

    研究互联网的同志应该都有听说过DAU(日活跃用户数).WAU(周活跃用户数)MAU(月活跃用户数),但是具体这些数字是怎么测算的?他们彼此之间又是怎样的关系?在本文中,笔者试图谈谈自己的一些思考,请大 ...

  9. 产品思考:如何计算资讯类产品的日活跃用户天花板?

    作者:lei 全文共 1834 字 2 图,阅读需要 4 分钟 ---- / BEGIN / ---- 结合市场现状及合理假设,请推算出资讯类 App 日活跃用户数 DAU 的天花板? 前 2 天,一 ...

最新文章

  1. Android okHttp上传图片
  2. python expected an indented block什么意思
  3. jquery获得下拉框的值
  4. java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求
  5. Postgres 9.2.4的升级方案与步骤
  6. Ubuntu14.04下安装Chrome出现“未安装软件包 libappindicator1”问题的解决办法
  7. Python之数据分析(规范数据生成器Faker,学习、数据分析、开发测试专用)
  8. 51单片机指针c语言,单片机C语言教程:C51指针的使用
  9. Linux目录树与文件系统
  10. 【火灾检测】基于matlab图像特征火灾检测【含Matlab源码 897期】
  11. Mybatis 拦截器报错
  12. vmware虚拟机共享文件夹设置(xp)
  13. 13.罗马数字转数字
  14. 【Python数据分析】二手车价格预测
  15. 达威尔液晶电子手写板儿童涂鸦画板写字板,培养小孩创造力和想象力的好工具!
  16. 分享一款免费下载音乐的软件
  17. 前端应届生如何做一个职业规划
  18. 进入BeOS的花花世界 系列四
  19. BOM物料清单及生产计划的分解
  20. 假作真时真亦假,无为有处有还无

热门文章

  1. 蓝桥杯练习题十三 - 第几个幸运数(c++)
  2. 单片机原理及应用c51周国运_实用!百万工程师都在使用的单片机开发产品流程...
  3. 语音噪声---学习笔记
  4. Android平台多屏播放同步方案
  5. 毕业年薪20万起!24届南京理工大学自动化最新三年考研院校分析
  6. nginx进程杀不掉解决方案
  7. Java教程:如何申请Java开发微信支付中的必要参数(appid,appsecret,商户号,微信支付密钥)
  8. 大臣得誉,非国家之美
  9. 阿里无人超市亮相乌镇,微笑购物能打折!诺奖得主现场点赞!
  10. 基于通道注意机制联合多尺度卷积神经网络的滚动轴承故障诊断