对连续登记,连续交易的计算方法:
– 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?