连续登陆的问题

博客内容涉及使用SQL查询找出在 Accounts 表中连续5天登录的用户。通过自连接和窗口函数来识别满足条件的用户ID,重点在于理解并应用日期差函数datediff和lead函数来确定连续登录。示例查询展示了如何从登录日志中筛选出至少连续3天登录的用户,并提供了两种不同的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对连续登记,连续交易的计算方法:

– MD,第三次遇到(第一次汉国中心,一个在印度做消费金融的小公司,富途。。。 vivo )

写一个 SQL 查询, 找到活跃用户的 id 和 name.
活跃用户是指那些至少连续 5 天登录账户的用户.
返回的结果表按照 id 排序.

Accounts 表:
id 是该表主键.
该表包含账户 id 和账户的用户名.

在这里插入图片描述

该表无主键, 可能包含重复项.
该表包含登录用户的账户 id 和登录日期. 用户也许一天内登录多次.

在这里插入图片描述
结果表格式如下例所示:

在这里插入图片描述
至少连续 5 天登录

select distinct a.id,a.name
from (
        select 
             a.id, 
             a.login_date as ad, 
             b.login_date as bd
        from logins a
        join logins b
        	on a.id = b.id 
           and datediff(a.login_date,b.login_date) between 0 and 4
         group by a.id, a.login_date
        having count(distinct b.login_date) = 5
        ) as t 
left join accounts a on a.id = t.id

解题技巧:

主表自连接以后,限制条件为
1.id相同
2. 日期相差0-4天(连续登陆5天)
3. 最后找出符合条件的日期合计达到5个的id

如何是连续登陆5天,那么在diff列在0-4范围内会有5行

自连接入门:

https://weibo.com/ttarticle/p/show?id=2309404763295747015573

这里先阐明一个自连接的问题

select *  from vivo_examen a  where id='1001' order by 1 

在这里插入图片描述

这里三条数据就会出现笛卡尔积,3*3 = 9

在这里插入图片描述
方法1 ,用自连接,能得到正确答案,连续登陆三天

select a.id as a ,a.dt as b ,  b.id as c , b.dt as d ,datediff(a.dt,b.dt)
from vivo_examen a 
join vivo_examen b 
  on a.id = b.id and datediff(a.dt,b.dt) between 0 and 2
group by  a.id,a.dt 
having count(distinct b.dt)>=3

汇总脚本得到如下:

with tmp as (
select id , dt ,sum(lowcarbon) as lowcarbon
from vivo_examen
group by id,dt 
having sum(lowcarbon)>=100
) 
,tmp2 as (
select 
      id 
     ,dt    -- 获取连续三天就偏移2 
     ,datediff(lead(dt, 2,'') over(partition by id order by dt),dt ) as diff
 from tmp
 ) 
 select id 
 from 
 tmp2 
 where diff=2

在这里插入图片描述

datediff(lead(dt, 2,'') over(partition by id order by dt),dt ) as diff 等于2
在这里插入图片描述
另一种最笨的解法:

vivo 考试题
建表
加载数据
步骤一,构造等差数列
思路:两个步长相同的等差数列相减,得到的值全部相同
第二步 加序号
步骤三 日期减去序号,用来打标

碳排放量在100以上的用户

with t1 as (           
select 
     id
    ,dt
	,sum(lowcarbon) lowcarbon
  from continuous
 group by id,dt
having lowcarbon>=100
)
,t2 as ( 
           select 
		   id,
           dt,
           lowcarbon,
           rank()over(partition by id order by dt) rk
           from t1
		   )
-- 这里 id,dt  不可能完全一样,因为上面已经分组了。
,t3 as (
select id
from t2
group by id,flag
having count(id)>=3

转载地址:
https://blog.csdn.net/QJQJLOVE/article/details/126800777?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值