hiveSQL面试题整理学习(2)

  • 一、示例数据:某网店用户访问表部分数据(user_id:用户ID,shop:店铺名,表名:visit)如下
  • (一)需求:每个店铺访问次数Top3的访客信息(输出店铺名称、访客id、访问次数)。
  • 二、示例数据:某订单表信息(表名:)如下:
  • (二)需求:求出 2017年每个月的订单数、用户数、总成交金额。
  • (一)需求:求出2017年1月的新客数(指在1月才有第一笔订单)
  • 三、示例数据:用户信息表数据如下(表名:user_info)
  • (一)需求:求出所有用户和活跃用户的总数及平均年龄(这里活跃用户指连续2天有访问记录的)。
  • 四、示例数据:这个和二(一)类似(表名:order_info)
  • (一)需求:所有用户中在今年10月份第一次购买商品的金额

一、示例数据:某网店用户访问表部分数据(user_id:用户ID,shop:店铺名,表名:visit)如下

(一)需求:每个店铺访问次数Top3的访客信息(输出店铺名称、访客id、访问次数)。

(1)查询每个店铺被每个用户访问次数

create temporary table tb1 as
selectshop,user_id,count(1) cnt
from visit
group by shop,user_id;

输出结果如下图:

(2)计算每个店铺被用户访问次数排名,取每个店铺排名前3的

selectuser_id,shop,cnt,rank
from(selectshop,user_id,cnt,row_number() over(partition by shop order by cnt) rankfrom tb1 a
) b
where rank <= 3;

输出结果如下图:

二、示例数据:某订单表信息(表名:)如下:

visit_Date:日期
Order_id:订单ID
User_id:用户ID
amount:交易金额

(二)需求:求出 2017年每个月的订单数、用户数、总成交金额。

selectsubstr(visit_date,1,7) as mth,      --月份count(Order_id) as order_cnt,       --月订单数count(distinct user_id) as user_cnt,--用户数sum(amount) as amount               --月总成交额
from order_info
group by substr(visit_date,1,7);

输出结果如下图:

sql解析:
这里需要用到截取日期的函数,也可以使用date_format(visit_date,‘YYYY-MM’)进行格式转换。

(一)需求:求出2017年1月的新客数(指在1月才有第一笔订单)

selectuser_id,              --这里便于好看理解列出新客的user_idcount(user_id) as cnt
from order_info
group by user_id
having date_format(min(visit_date),'YYYY-MM') = '2017-01';

输出结果如下图:

sql解析:
我们按user_id进行分组后会得到用户的所有交易日期,通过having过滤指定新客月份即可得出新客总数。

三、示例数据:用户信息表数据如下(表名:user_info)

User_id:用户ID
User_age:用户年龄
Login_date:登录日期

(一)需求:求出所有用户和活跃用户的总数及平均年龄(这里活跃用户指连续2天有访问记录的)。

(1)先按日期和用户分组,按照日期排序并排名

create temporary table tb1 as
selectuser_id,login_date,min(user_age) as user_age,row_number() over(partition by user_id order by login_date) as rank
from user_info_1
group by login_date,user_id;

输出结果如下图:

(2)计算日期和排名的差值(标记为flag)

create temporary table tb2 as
selectuser_id,user_age,date_sub(login_date,rank) as flag
from tb1;

输出结果如下图:

(3)再根据(2)过滤出差值大于等于2的即为活跃用户。

create temporary table tb3 as
selectuser_id,min(user_age) as user_age
from tb2
group by user_id,flag
having count(1) >= 2;

输出结果如下图:

(4)从(3)的输出结果看有2条相同的数据,从(2)的输出结果圈出来的地方可以明白为什么会这样,这里再进行一次去重就可以了

create temporary table tb4 as
selectuser_id,min(user_age) as user_age
from tb3
group by user_id;

输出结果如下图:

(5)计算活跃用户的人数以及平均年龄

create temporary table tb5 as
selectcount(user_id) as cnt_2, --活跃用户总数--活跃用户的均龄cast(sum(user_age) / count(user_id) as decimal(10,2)) as avg_age
from tb4;

输出结果如下图:

(6)计算所有用户数以及所有用户的平均年龄

create temporary table tb6 as
selectcount(user_id) as user_count, --所有用户总数cast(sum(user_age) / count(user_id) as decimal(10,2)) as all_avg_age --所有用户的均龄
from(--这一步的目的是进行数据的去重,数据量小也可以用distinct来做selectuser_id,min(user_age) as user_agefrom user_info_1 agroup by user_id
)b;

输出结果如下图:

(7)将(5)的结果数据集和(6)的结果数据集拼接成一张表

select0 as user_total_count,   --拼接字段0 as user_total_avg_age, --拼接字段count(1) as 2_count,cast(sum(user_age) / count(user_id) as decimal(10,2)) as 2_count_avg_age
from(selectuser_id,min(user_age) as user_agefrom(selectuser_id,min(user_age) as user_agefrom(selectuser_id,user_age,date_sub(login_date,rank) as flagfrom(selectuser_id,login_date,min(user_age) as user_age,row_number() over(partition by user_id order by login_date) as rankfrom user_infogroup by login_date,user_id)t1)t2 group by user_id,flag having count(1) >= 2)t3 group by user_id
)t4
union all
selectcount(1) user_total_count,cast(sum(user_age) / count(user_id) as decimal(10,2)) as user_total_avg_age,0 as 2_count,         --拼接字段0 as 2_count_avg_age  --拼接字段
from(selectuser_id,min(user_age) as user_agefrom user_infogroup by user_id
)t5;

输出结果如下图:

sql解析:
对于表的不同列拼接,可以将待拼接的表手动添加字段构建出字段相同的2张表就可以进行union操作了。
(8)将(7)的输出结果再聚合操作一下可去除值为0的相关数据

selectmax(user_total_count)   as user_total_count,max(user_total_avg_age) as user_total_avg_age,max(2_count)         as 2_count,max(2_count_avg_age) as 2_count_avg_age
from(select0 as user_total_count,0 as user_total_avg_age,count(1) as 2_count,cast(sum(user_age) / count(user_id) as decimal(10,2)) as 2_count_avg_agefrom(selectuser_id,min(user_age) as user_agefrom(selectuser_id,min(user_age) as user_agefrom(selectuser_id,user_age,date_sub(login_date,rank) as flagfrom(selectuser_id,login_date,min(user_age) as user_age,row_number() over(partition by user_id order by login_date) as rankfrom user_infogroup by login_date,user_id)t1)t2 group by user_id,flag having count(1) >= 2)t3 group by user_id)t4union allselectcount(1) user_total_count,cast(sum(user_age) / count(user_id) as decimal(10,2)) as user_total_avg_age,0 as 2_count,0 as 2_count_avg_agefrom(selectuser_id,min(user_age) as user_agefrom user_infogroup by user_id)t5
)t;

输出结果如下图:

四、示例数据:这个和二(一)类似(表名:order_info)

购买用户:user_id
金额:money
购买时间:payment_time(格式:2017-10-01)
订单id:order_id

(一)需求:所有用户中在今年10月份第一次购买商品的金额

selectuser_id,money,payment_time,order_id
from(selectuser_id,money,payment_time,order_id,--这里按10月份的购买时间升序排序,排名第一的就是第一次rank() over(partition by user_id order by payment_time) rankfrom order_infowhere date_format(payment_time,'yyyy-MM') = '2017-10'
) a
where rank = 1;--这里取到的就是10月最早(第一次)购买时间

输出结果如下图:

[hiveSQL面试题2]相关推荐

  1. [hiveSQL面试题3]

    hiveSQL面试题整理学习(3) 一.示例数据:交易信息表数据如下(表名:trans_info) (一)需求:用一条sql语句得出下列结果 二.示例数据:客户持仓表表数据如下(表名:stock_in ...

  2. HiveSql面试题11详解(count(1)、count(*)和count(列名)的区别)

    从执行结果来看 - count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL - count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL ...

  3. 【博学谷学习记录】超强总结,用心分享|HiveSQL面试题实战(二)|详细的步骤解析

    文章目录 第6题:电商购买金额统计实战 数据准备 请用sql写出所有用户中在今年10月份第一次购买商品的金额 第7题:教育领域SQL实战 表结构 (1)创建图书管理库的图书.读者和借阅三个基本表的表结 ...

  4. SQL之一种通用的连续性问题处理方法【重分组算法】--HiveSQL面试题33

    目录 0 需求分析 1 数据准备 2 数据分析 3 小 结 0 需求分析 数据如下: wang 2020-05-01 wang 2020-05-01 wang 2020-05-01 wang 2020 ...

  5. SQL重叠交叉区间问题分析--HiveSQL面试题30

    目 录 0 需求分析 1 数据准备 2 数据分析 3 小 结 0 需求分析 如下为平台商品促销 数据: 字段为品牌,打折开始日期,打折结束日期 id  stt  edt oppo 2021-06-05 ...

  6. HIveSQL面试题52:近一个月发布的视频中热度最高的top3视频【抖音面试题,不得不去吐槽的一个题目】

    目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 现有用户-视频互动表tb_user_video_log id uid video_id start_time end_time ...

  7. HiveSQL面试题

    1.我们有如下的用户访问数据 userId visitDate visitCount u01 2017/1/21 5 u02 2017/1/23 6 u03 2017/1/22 8 u04 2017/ ...

  8. SQL之求股票的波峰和波谷--HiveSQL面试题33【今日头条】

    目录 0 需求 1 数据准备 2 数据分析 3 小 结 0 需求:求股票的波峰Crest 和 波谷trough 波峰:当天的股票价格大于前一天和后一天 波谷:当天的股票价格小于前一天和后一天数据准备: ...

  9. HiveSql面试题12--如何分析去掉最大最小值的平均薪水(字节跳动)

    目录 0 问题描述 1 数据准备 2 数据分析 3 小结 0 问题描述 薪水表中是员工薪水的基本信息,包括雇员编号,部门编号和薪水 第1行表示雇员编号为10001的员工在1号部门,薪水为60117元; ...

最新文章

  1. matlab中的timer模块,[转载]Matlab中Timer的使用
  2. Blueprint简介-Android10.0编译系统(六)
  3. HK-2000 数采仪 航空头接口定义
  4. java map 排序_java集合框架面试题大集合
  5. VC++ 使用BitBlt函数显示位图
  6. 1.多彩的幕布CCLayerColor,CCLayerGradient
  7. rcp rapido_Rapido使用数据改善乘车调度
  8. 构建可扩展的思科互联网络---单区域OSPF
  9. Photoshop小技巧集锦八十条
  10. 《土豆荣耀》重构笔记(八)添加角色的动画
  11. Samba 实现文件共享
  12. 智慧农业,绿色农业智慧管理平台
  13. 一个超级棒的 Chrome 翻译插件
  14. UR机器人双臂开发实例
  15. 微信小程序中播放海康萤石云HLS '.m3u8'视频 video标签
  16. Python:11设计动物Animal类,该类包括颜色color属性与叫call方法。再设计鱼Fish类,包括.....
  17. Dapp区块链 | wireshark抓包2
  18. 面对 ESM 的开发模式,webpack 还有还手之力吗?(转载)
  19. 跟我学aspectj之十三 ----- AspectJ其他功能介绍
  20. Hackthebox::grandpa walkthrough

热门文章

  1. web前端开发框架有哪些
  2. HttpStatus状态码
  3. 《JavaScript设计模式》读后感
  4. 神奇宝贝 眼前一亮的 Jetpack + MVVM 极简实战
  5. [XSIM 43-3225]Cannot find tb design unit work. in library work located at xsim.dir /work解决
  6. ios识别人脸自动拍照_面部识别是否会自动拍照上传?
  7. window下安装tensorflow问题
  8. word之如何独立地拖动表格框线
  9. 本地cdn缓存:解决Mathjax不稳定加载不出来公式
  10. 跟我一起学Python——机械学习实现之数据预处理(混淆矩阵,印第安人糖尿病案例)(Second day)