Hive sql 每天场景题37-38

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

结果如下:

level

cn

忠实用户

新增用户

沉睡用户

需要用到的表:

用户登录明细表: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('2021-10-09',recent_login_ts)7) then '忠实用户'
 when datediff('2021-10-09',frist_login_ts) 38、用户每天签到可以领1金币,并可以累计签到天数,连续签到的第3、7天分别可以额外领2和6金币。每连续签到7天重新累积签到天数。从用户登录明细表中求出每个用户金币总数,并按照金币总数倒序排序结果如下:user_id(用户id)sum_coin_cn(金币总数)1011091071021061041031010108105需要用到的表:用户登录明细表:user_login_detailuser_id(用户id)ip_address(ip地址)login_ts(登录时间)logout_ts(登出时间)101180.149.130.1612021-09-21 08:00:002021-09-27 08:30:00102120.245.11.22021-09-22 09:00:002021-09-27 09:30:0010327.184.97.32021-09-23 10:00:002021-09-27 10:30:00with 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、未连续超过七天的
user_id
,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 
,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_cnt
  from t2
  group by 
  user_id
,days
,week_cnt
)a

Original: https://blog.csdn.net/weixin_43859562/article/details/128742139
Author: 吃再多糖也不长胖
Title: Hive sql 每天场景题37-38

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/817790/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球