SQL练习-最多连胜/访问峰值/关联用户问题

452 阅读1分钟

1 最多连胜次数

题目:获取player_id最多连胜天数,如果中间有draw失败连胜重置计算 在这里插入图片描述

首先对player_id分区排序,再对player_id,result分区排序,如图上右侧
两者相减的结果如果相同则算为同一个组,然后sum每个组获胜的1值即可获得结果

select 
	player_id,
	max(cnt) as cnt
from
(
	select 
		player_id,
		num1-num2,
		sum(if_win) as cnt
	from
	(
			select 
				player_id,
				if(result='win','1','0') as if_win,
				row_number () over (partition by player_id order by match_day) as num1,
				row_number () over (partition by player_id, result order by match_day) as num2
			from 
				matches
	) t
	group by 
		player_id,
		num1-num2,
) t
group by
	player_id;

2 如上SQL依然有问题,因为没有考虑日期的连贯性,需要加入datediff来判断

select 
	player_id,
	max(cnt) as cnt
from
(
	select 
		player_id,
		dt_num-num2,
		sum(if_win) as cnt
	from
	(
			select 
				player_id,
				if(result='win','1','0') as if_win,
				datediff(match_day,'1997-01-01') as dt_num,
				row_number () over (partition by player_id, result order by match_day) as num2
			from 
				matches
	) t
	group by 
		player_id,
		dt_num-num2,
) t
group by
	player_id;

2 直播间访问人数峰值

问题: 在这里插入图片描述 解题过程: 在这里插入图片描述 在这里插入图片描述 SQL代码

select 
	max(num) as num,
from
(
	select 
		id,
		dt,
		live,
		sum(live) over (partition by id order by dt) as num
	from
	(
			select 
				id,
				stt as dt,
				1 as live
			from live
			union all
			select
				id,
				edt as dt,
				-1 as live
			from live
	) t
	group by dt
) t

3 相关关注用户

在这里插入图片描述 问题:user1和user2两张表,如图上,输出互相关联的结果即a b/b a,排除c d

select 
	t1.user1,
	t1.user2
from
(
	select 
		user1,
		user2
	from guanzhu
	group by
		user1,
		user2
) t1
join
(				
	select 
		user1,
		user2
	from guanzhu
	group by
		user1,
		user2
) t2
on t1.user1 = t2.user2
and t2.user1 = t1.user2