题目来源:
每天一道大厂SQL题【Day05】活跃用户统计_sql 活跃用户_Maynor996的博客-CSDN博客
仅为纪录学习使用,侵删;
需求:
请写出代码求得所有用户和活跃用户的总数及所有用户和活跃用户的平均年龄(活跃用户指连续两天都有访问记录的用户)
准备:
CREATE TABLE backup.test_230428_lyq(
dt string, user_id string, age int)
ROW format delimited fields terminated BY ',';
INSERT INTO TABLE backup.test_230428_lyq VALUES ('2019-02-11','test_1',23);
INSERT INTO TABLE backup.test_230428_lyq VALUES ('2019-02-11','test_2',19);
INSERT INTO TABLE backup.test_230428_lyq VALUES ('2019-02-11','test_3',39);
INSERT INTO TABLE backup.test_230428_lyq VALUES ('2019-02-11','test_1',23);
INSERT INTO TABLE backup.test_230428_lyq VALUES ('2019-02-11','test_3',39);
INSERT INTO TABLE backup.test_230428_lyq VALUES ('2019-02-11','test_1',23);
INSERT INTO TABLE backup.test_230428_lyq VALUES ('2019-02-12','test_2',19);
INSERT INTO TABLE backup.test_230428_lyq VALUES ('2019-02-13','test_1',23);
INSERT INTO TABLE backup.test_230428_lyq VALUES ('2019-02-15','test_2',19);
INSERT INTO TABLE backup.test_230428_lyq VALUES ('2019-02-16','test_2',19);
实现:
-- 所有用户
select
count(user_id) as cnt_user
,avg(age) as avg_age
from (
select
user_id,age
from backup.test_230428_lyq
group by user_id,age
) t
union all
--活跃用户
select
count(user_id) as cnt_user
,avg(age) as avg_age
from (
select
user_id,age,count(1) cnt
from (
select
user_id,age,date_sub(dt,rn) as sub_date
from (
select
user_id,dt,age,row_number() over(partition by user_id order by dt) rn
from (
select dt,user_id,age from backup.test_230428_lyq group by dt,user_id,age
) t1
) t2
) t3
group by user_id,age
having count(1) >= 2
) t4