SQL-连续登录-解法1、2

select id,count(1) log_num
from(
SELECT id,
       DATE_SUB(dt,INTERVAL (ROW_NUMBER() over (PARTITION by id ORDER BY dt)) day) rn
FROM(
select id,SUBSTR(date,1,10) dt
FROM `连续登录`
GROUP BY id,dt
)a
)b
GROUP BY id,rn

字段只有id,date,第一个解法如上

用row_number排序之后,再减去他们的排名,如果是一样的,那就是连续登录,不一样就是不连续(不记得就自己写着看看)

date_sub之后就是他们相同与否的日期,这个不能直接count,因为这个字段的结果不一样,后面算连续登录几天的时候还要借助这个进行分组count

这个解法会把只出现1天的也算出来,不过问题不大,题目要多少,回头写个条件筛选一下

聚合和group by,类似于数透

第二个解法,用lag&lead,貌似只能展现至少连续登录3天的,全展现出来的我目前还不会

SELECT id
from(
SELECT id,dt,
       LAG(dt) over (PARTITION by id ORDER BY dt) pre_dt,
			 lead(dt) over (PARTITION by id ORDER BY dt) ne_dt
FROM(
select id,
      SUBSTR(date,1,10) dt
FROM `连续登录`
GROUP BY id,dt
) a
)b
where DATEDIFF(dt,pre_dt) =1 and DATEDIFF(ne_dt,dt) =1
GROUP BY id
SELECT id,SUM(ds)
FROM(
SELECT id,stdt,
(case
when ldt is NULL then 0
when DATEDIFF(stdt,ldt) =1 then 1
else 0 end ) ds
FROM(
SELECT id, stdt,lag(stdt) over (PARTITION by id ORDER BY stdt) ldt
FROM(
select id, substr(date,1,10) stdt
from log_reverse
) t1
) t2
) t3
GROUP BY id
-- 这个只能算至少连续登录三天的

这个就很直观,不用想的那么复杂(函数会用的话),但就是不知道咋把他们每一天登陆的写出来

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值