SQL之断点连续问题

1001    2022-04-02
1001    2022-04-04
1001    2022-04-05
1001    2022-04-07
1001    2022-04-11
1001    2022-04-12
1001    2022-04-14
1002    2022-04-03
1002    2022-04-05
1002    2022-04-07
1002    2022-04-09
1002    2022-04-11
1002    2022-04-15
1002    2022-04-16
上述数据表示用户登录的日期(已经去重)
计算每个用户连续登录的最大天数,注意:断一天也算连续

select
    id,
    dt,
    lag(dt,1,'1970-01-01')over(partition by id order by dt) lag_dt
from new_test t1

+-------+-------------+-------------+
|  id   |     dt      |   lag_dt    |
+-------+-------------+-------------+
| 1001  | 2022-04-02  | 1970-01-01  |
| 1001  | 2022-04-04  | 2022-04-02  |
| 1001  | 2022-04-05  | 2022-04-04  |
| 1001  | 2022-04-07  | 2022-04-05  |
| 1001  | 2022-04-11  | 2022-04-07  |
| 1001  | 2022-04-12  | 2022-04-11  |
| 1001  | 2022-04-14  | 2022-04-12  |
| 1002  | 2022-04-03  | 1970-01-01  |
| 1002  | 2022-04-05  | 2022-04-03  |
| 1002  | 2022-04-07  | 2022-04-05  |
| 1002  | 2022-04-09  | 2022-04-07  |
| 1002  | 2022-04-11  | 2022-04-09  |
| 1002  | 2022-04-15  | 2022-04-11  |
| 1002  | 2022-04-16  | 2022-04-15  |
+-------+-------------+-------------+

select
    id,
    dt,
    lag_dt,
    datediff(dt,lag_dt) d_diff
from (select
    id,
    dt,
    lag(dt,1,'1970-01-01')over(partition by id order by dt) lag_dt
from new_test)t1  t2
+-------+-------------+-------------+---------+
|  id   |     dt      |   lag_dt    | d_diff  |
+-------+-------------+-------------+---------+
| 1001  | 2022-04-02  | 1970-01-01  | 19084   |
| 1001  | 2022-04-04  | 2022-04-02  | 2       |
| 1001  | 2022-04-05  | 2022-04-04  | 1       |
| 1001  | 2022-04-07  | 2022-04-05  | 2       |
| 1001  | 2022-04-11  | 2022-04-07  | 4       |
| 1001  | 2022-04-12  | 2022-04-11  | 1       |
| 1001  | 2022-04-14  | 2022-04-12  | 2       |
| 1002  | 2022-04-03  | 1970-01-01  | 19085   |
| 1002  | 2022-04-05  | 2022-04-03  | 2       |
| 1002  | 2022-04-07  | 2022-04-05  | 2       |
| 1002  | 2022-04-09  | 2022-04-07  | 2       |
| 1002  | 2022-04-11  | 2022-04-09  | 2       |
| 1002  | 2022-04-15  | 2022-04-11  | 4       |
| 1002  | 2022-04-16  | 2022-04-15  | 1       |
+-------+-------------+-------------+---------+

select
    id,
    dt,
    sum(if(d_diff>2,1,0))over(partition by id order by dt) flag
from (select
    id,
    dt,
    lag_dt,
    datediff(dt,lag_dt) d_diff
from (select
    id,
    dt,
    lag(dt,1,'1970-01-01')over(partition by id order by dt) lag_dt
from new_test)t1 )t2  t3

+-------+-------------+-------+
|  id   |     dt      | flag  |
+-------+-------------+-------+
| 1001  | 2022-04-02  | 1     |
| 1001  | 2022-04-04  | 1     |
| 1001  | 2022-04-05  | 1     |
| 1001  | 2022-04-07  | 1     |
| 1001  | 2022-04-11  | 2     |
| 1001  | 2022-04-12  | 2     |
| 1001  | 2022-04-14  | 2     |
| 1002  | 2022-04-03  | 1     |
| 1002  | 2022-04-05  | 1     |
| 1002  | 2022-04-07  | 1     |
| 1002  | 2022-04-09  | 1     |
| 1002  | 2022-04-11  | 1     |
| 1002  | 2022-04-15  | 2     |
| 1002  | 2022-04-16  | 2     |
+-------+-------------+-------+


select
    id,
    flag,
    (datediff(max(dt),min(dt)) + 1) days
from
    (select
    id,
    dt,
    sum(if(d_diff>2,1,0))over(partition by id order by dt) flag
from (select
    id,
    dt,
    lag_dt,
    datediff(dt,lag_dt) d_diff
from (select
    id,
    dt,
    lag(dt,1,'1970-01-01')over(partition by id order by dt) lag_dt
from new_test)t1 )t2)t3
group by id,flag;
+-------+-------+-------+
|  id   | flag  | days  |
+-------+-------+-------+
| 1001  | 1     | 6     |
| 1001  | 2     | 4     |
| 1002  | 1     | 9     |
| 1002  | 2     | 2     |
+-------+-------+-------+

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值