大数据SQL经典面试题系列(1) - 连续3天登录用户
·
1 123 2018-08-02
2 123 2018-08-03
3 123 2018-08-04
4 456 2018-11-02
5 456 2018-12-09
6 789 2018-01-01
7 789 2018-04-23
8 789 2018-09-10
9 789 2018-09-11
10 789 2018-09-12
create table day_3(
id int,
user_id int,
login_date String
)
row format delimited fields terminated by '\t';
load data local inpath '/usr/hdk/data/day3.txt' into table day_3;
SELECT
user_id,
count(1) cnt
FROM
(SELECT
user_id,
login_date,
row_number() over ( PARTITION BY user_id ORDER BY login_date) rn
FROM
day_3
)t
GROUP BY
user_id,
date_sub ( login_date, t.rn )
HAVING
count( 1 ) >= 3
ORDER BY
user_id
;
- 按照ID分组,日期排序,获得每个日期在组内的序号。
- 用当前日期减去序号,如果用户是连续登陆的,那么结果的值必然相等。
| user_id | login_date | rn | flag_date |
|---|---|---|---|
| 789 | 2018-01-01 | 1 | 2017-12-31 |
| 789 | 2018-04-23 | 2 | 2018-04-21 |
| 789 | 2018-09-10 | 3 | 2018-09-07 |
| 789 | 2018-09-11 | 4 | 2018-09-07 |
| 789 | 2018-09-12 | 5 | 2018-09-07 |
3.然后再次按照user_id和flag_date(data_sub ( login_date, t.rn ) )分组,如果重复项大于等于三,就表示有连续三天登陆。
4.如果想要最近三天登陆,只需要将最近三天的数据导出然后运行此SQL。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)