分类详情
用户最大连续登陆天数
问题是用户登陆埋点,会记录用户的id和记录的日期,原始数据如下:
| id | ds |
|---|---|
| A | 2019-01-01 |
| B | 2019-01-02 |
| A | 2019-01-02 |
| A | 2019-01-04 |
| B | 2019-01-03 |
| B | 2019-01-04 |
| B | 2019-01-05 |
期望中的结果是统计用户A,和用户B分别最多连续登陆多少天:
| id | days |
|---|---|
| A | 2 |
| B | 4 |
问题的难点是,数据按天储存,并不知道同一id相邻两次登陆是否是连续,虽然可以查看相邻date相减看是否为1,但是要求最大连续天数,count也比较难操作。
我的思路是:先按id分区,按照ds递减排序,给予rank,并将rank与ds相加,理论上rank是隔1递增的,如果日期连续,则日期是隔1递减,因此连续日期的ds+rank应该相同:
| id | ds | rank | rank+ds |
|---|---|---|---|
| A | 2019-01-04 | 1 | 2019-01-05 |
| A | 2019-01-02 | 2 | 2019-01-04 |
| A | 2019-01-01 | 3 | 2019-01-04 |
| B | 2019-01-05 | 1 | 2019-01-06 |
| B | 2019-01-04 | 2 | 2019-01-06 |
| B | 2019-01-03 | 3 | 2019-01-06 |
| B | 2019-01-02 | 4 | 2019-01-06 |
再根据rank+ds聚合,则可以统计对于一个用户而言,其每段连续登陆操作的天数,然后取每个用户的最大登陆天数即可:
| id | rank+ds | count |
|---|---|---|
| A | 2019-01-05 | 1 |
| A | 2019-01-04 | 2 |
| B | 2019-01-06 | 4 |
代码如下:
SELECT id, MAX(num_days) AS max_continue
FROM (
SELECT id, tmp_index, COUNT(1) AS num_days
FROM (
SELECT id, ds
,DATE_ADD(ds, row_number() OVER (PARTITION by boss_id ORDER BY ds DESC)) AS tmp_index
FROM da_tmp.boss_filter_xnc
) a
GROUP BY id, tmp_index
) a
GROUP BY id;
问题汇总
版权声明:本文为nightwish2018原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。