Hive sql 每天场景题37-38
创始人
2024-05-14 12:51:09
0

37、用户等级:
忠实用户:近7天活跃且非新用户
新晋用户:近7天新增
沉睡用户:近7天未活跃但是在7天前活跃
流失用户:近30天未活跃但是在30天前活跃
假设今天是数据中所有日期的最大值,从用户登录明细表中的用户登录时间给各用户分级,求出各等级用户的人数

结果如下:

level

(用户等级)

cn

(用户数量)

忠实用户

6

新增用户

3

沉睡用户

1

需要用到的表:

用户登录明细表:user_login_detail

user_id(用户id)

ip_address(ip地址)

login_ts(登录时间)

logout_ts(登出时间)

101

180.149.130.161

2021-09-21 08:00:00

2021-09-27 08:30:00

102

120.245.11.2

2021-09-22 09:00:00

2021-09-27 09:30:00

103

27.184.97.3

2021-09-23 10:00:00

2021-09-27 10:30:00

代码:这题题目没有给出今天是哪天,所以代码是没经过测试的

with t as (select 
user_id
,min(substr(login_ts,1,10)) as frist_login_ts
,max(substr(login_ts,1,10)) as recent_login_ts
from user_login_detail
group by user_id)select 
level
,count(user_id) as cn
from (
select 
user_id
,case when (datediff('2023-01-20',recent_login_ts)<=6 and datediff('2023-01-20',frist_login_ts) >6) then '忠实用户'when datediff('2023-01-20',frist_login_ts) <=6 then '新晋用户'when datediff('2023-01-20',recent_login_ts) between 6 and 30 then '沉睡用户' else '流失用户' end as level from t
)a
group by level

38、用户每天签到可以领1金币,并可以累计签到天数,连续签到的第3、7天分别可以额外领2和6金币。
每连续签到7天重新累积签到天数。
从用户登录明细表中求出每个用户金币总数,并按照金币总数倒序排序

结果如下:

user_id

(用户id)

sum_coin_cn

(金币总数)

101

7

109

3

107

3

102

3

106

2

104

2

103

2

1010

2

108

1

105

1

需要用到的表:

用户登录明细表:user_login_detail

user_id(用户id)

ip_address(ip地址)

login_ts(登录时间)

logout_ts(登出时间)

101

180.149.130.161

2021-09-21 08:00:00

2021-09-27 08:30:00

102

120.245.11.2

2021-09-22 09:00:00

2021-09-27 09:30:00

103

27.184.97.3

2021-09-23 10:00:00

2021-09-27 10:30:00

代码

with t as (
select 
*,count(*) over(partition by user_id, olddate) as lianxudays,count(distinct login_ts) over(partition by user_id )as days
from (
select * 
,date_add(login_ts,-rn) as olddate
from (
select  user_id,substr(login_ts,1,10) as login_ts 
,row_number() over(partition by user_id order by substr(login_ts,1,10) ) as rn
from user_login_detail
) b
)a)
, t2 as (
select 
-- 连续签到分二种情况:1、连续超过七天的, 2、未连续超过七天的  
,days
,cast (lianxudays /7 as int )+1 as week_cnt
,case when (lianxudays % 7) < 3 then 0 when (lianxudays % 7) between 3 and 6 then 2 else  8 end  external_cnt
from t 
group by 
user_id
,days
,cast (lianxudays /7 as int )+1  -- 当前第几次7天循环循环
,case when (lianxudays % 7) < 3 then 0  when (lianxudays % 7) between 3 and 6 then 2 else  8 end
)select 
user_id
,days + external_cnt*week_cnt as sum_coin_cn
from 
(
select 
user_id
,days
,week_cnt
,sum(external_cnt)as external_cntfrom t2group by user_id
,days
,week_cnt
)a

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...