hive练习题(三)

用户号场景访问时间
110011400
210021401
110021402
110011402
210031403
210041404
310031400

要求:

用户号对应前两个不同场景,场景重复的话选择场景的第一个访问时间,场景号不足两个的输出为止

输出结果示例:

result
1-1001-1002
2-1002-1003
3-1003
create table test
(userid varchar(20),
changjing varchar(20),
inttime varchar(20)
);
insert into test values
(1,1001,1400),
(2,1002,1401),
(1,1002,1402),
(1,1001,1402),
(2,1003,1403),
(2,1004,1404),
(3,1003,1400),
(4,1004,1402),
(4,1003,1403),
(4,1001,1403),
(4,1002,1404),
(5,1002,1402),
(5,1002,1403),
(5,1001,1404),
(5,1003,1405);

解答

关键词:每位用户 、前两个不同场景、

注意:若场景重复,选择第一个访问时间的场景

思路:找出每位用户在每个场景下的最早访问时间,对最早访问时间进行排序,以便找出前两个场景;

第一步:找出每位用户 是第一个访问时间的所有场景

SELECT userid, changjing, MIN(inttime) AS inttime
FROM test
GROUP BY userid, changjing ORDER BY userid, inttime

输出结果:
在这里插入图片描述

第二步:对每位用户的所有场景按照时间进行排名

SELECT *,row_number()over(PARTITION BY userid ORDER BY inttime ) AS rn
FROM (SELECT userid, changjing, MIN(inttime) AS inttime
FROM test
GROUP BY userid, changjing ORDER BY userid, inttime)a;

输出结果:
在这里插入图片描述

第三步:筛选出前两个场景

SELECT * FROM
(SELECT *,row_number()over(PARTITION BY userid ORDER BY inttime ) AS rn
FROM (SELECT userid, changjing, MIN(inttime) AS inttime
FROM test
GROUP BY userid, changjing ORDER BY userid, inttime) a ) b WHERE rn<=2;

输出结果:
在这里插入图片描述

第四步:对用户进行分组,使用concat函数和group_concat函数得到所要求的结果形式。

SELECT CONCAT(userid,'-',GROUP_CONCAT(changjing SEPARATOR '-')) AS result FROM 
(SELECT *,row_number()over(PARTITION BY userid ORDER BY inttime ) AS rn
FROM 
(SELECT userid, changjing, MIN(inttime) AS inttime FROM test
GROUP BY userid, changjing ORDER BY userid, inttime)a
)b 
WHERE rn<=2
GROUP BY userid;

得到最终结果:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值