Hive SQL 面试题及解析过程

本文介绍了如何使用Hive SQL查询用户在特定时间内连续多天低碳排放超过100g的记录。涉及日期处理、窗口函数和数据聚合操作,如date_format、row_number() over、count等。
摘要由CSDN通过智能技术生成

问题

问题:查询user_low_carbon表中每日流水记录,条件为:
用户在2017年,连续三天(或以上)的天数里,
每天减少碳排放(low_carbon)都超过100g的用户低碳流水。
需要查询返回满足以上条件的user_low_carbon表中的记录流水。
例如用户u_002符合条件的记录如下,因为2017/1/2~2017/1/5连续四天的碳排放量之和都大于等于100g:
seq(key) user_id data_dt low_carbon
xxxxx10 u_002 2017/1/2 150
xxxxx11 u_002 2017/1/2 70
xxxxx12 u_002 2017/1/3 30
xxxxx13 u_002 2017/1/3 80
xxxxx14 u_002 2017/1/4 150
xxxxx14 u_002 2017/1/5 10

表名

以下表记录了用户每天的蚂蚁森林低碳生活领取的记录流水。

table_name:user_low_carbon

user_id , data_dt , low_carbon
用户 , 日期 , 减少碳排放(g)

数据样例

提供的数据说明:

user_low_carbon:
u_001	2017/1/1	10
u_001	2017/1/2	150
u_001	2017/1/2	110
u_001	2017/1/2	10
u_001	2017/1/4	50
u_001	2017/1/4	10
u_001	2017/1/6	45
u_001	2017/1/6	90
u_002	2017/1/1	10
u_002	2017/1/2	150
u_002	2017/1/2	70
u_002	2017/1/3	30
u_002	2017/1/3	80
u_002	2017/1/4	150
u_002	2017/1/5	101
u_002	2017/1/6	68

创建表

create table user_low_carbon
(user_id String,data_dt String,low_carbon int)
row format delimited fields terminated by '\t';

加载数据

load data local inpath “/opt/module/hive/datas/user_low_carbon.txt” into table user_low_carbon;

解析

a.格式化日期

SELECT user_id,DATE_FORMAT(regexp_replace(data_dt,'/','-'),'yyyy-MM-dd') AS data_dt,low_carbon
FROM user_low_carbon

==>t1

b.将每个人每天总能量超过100g的数据查出来。

SELECT t1.user_id,t1.data_dt,SUM(t1.low_carbon) day_sum_low_carbon
FROM 
(SELECT user_id,DATE_FORMAT(regexp_replace(data_dt,'/','-'),'yyyy-MM-dd') AS data_dt,low_carbon
FROM user_low_carbon)t1
WHERE YEAR(data_dt)='2017'
GROUP BY t1.user_id,t1.data_dt
HAVING day_sum_low_carbon>=100

===>t2

c.连续三天

– 1.对一条数据来说,如何计算连续三天的情况:

前天  昨天  今天
昨天  今天  明天
今天  明天  后天

– 2.真正满足连续:

今天-昨天=1  AND  今天-前天=2
OR
今天-昨天=1  AND  今天-明天=-1
OR
今天-明天=-1 AND 今天-后天=-2

d. 将前天, 昨天, 明天,后天的数据提取到当前行

 SELECT t2.user_id,t2.day_sum_low_carbon,t2.data_dt jt,
 lag(t2.data_dt,2,'1970-01-01') over(PARTITION BY t2.user_id ORDER BY t2.data_dt) qt,
  lag(t2.data_dt,1,'1970-01-01') over(PARTITION BY t2.user_id ORDER BY t2.data_dt) zt,
  lead(t2.data_dt,1,'1970-01-01') over(PARTITION BY t2.user_id ORDER BY t2.data_dt) mt,
 lead(t2.data_dt,2,'1970-01-01') over(PARTITION BY t2.user_id ORDER BY t2.data_dt) ht
 FROM 
 (SELECT t1.user_id,t1.data_dt,SUM(t1.low_carbon) day_sum_low_carbon
FROM 
(SELECT user_id,DATE_FORMAT(</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值