AB球队得分流水表,得到连续三次得分的队员名字 和每次赶超对手的球员名字(pdd)

AB球队得分流水表,得到连续三次得分的队员名字 和每次赶超对手的球员名字(pdd)

在复盘时发现有类似原题,这是我在面试中遇到的最难的题

问题:两支篮球队进行了激烈的篮球比赛,比分交替上升。比赛结束后,你有一张两队得分分数的明细表,记录了球队team,球员号码number,球员姓名name, 得分分数score 以及得分时间scoretime(datetime)。现在球队要对比赛中表现突出的球员做出嘉奖,所以请你用sql统计出

1)连续三次(及以上)为球队得分的球员名单

--  从两队的整体作为时间连续考虑:
select distinct name 
from 
(
select  *
   		,row_number()over(order by score_time asc) as rank1
   		,row_number()over(partition by `team`,`number` order by score_time  asc ) rank2
   		,(row_number()over(order by score_time asc) - row_number()over(partition by `team`,`number` order by score_time  asc )) as diff
from basketball_game_score_detail
)t
group by diff,name
having count(1) >=3 ;



-- 从自身所在的队的作为时间连续考虑:

# 我的求解思路:
select distinct name
from 
(
select  *
   		,row_number()over(partition by team order by score_time asc) as rank1
   		,row_number()over(partition by team,`number` order by score_time  asc ) rank2
   		,(row_number()over(partition by team order by score_time asc) - 
   		  row_number()over(partition by `team`,`number` order by score_time  asc )) as diff
from basketball_game_score_detail
)t
group by diff,name
having count(1) >=3 ;



# 另外一位作者的求解思路也是可以的:
select distinct a.name ,a.team from
(
select   *
        ,lead(name,1) over(partition by team order by score_time) as ld1
		,lead(name,2) over(partition by team order by score_time) as ld2
		,lag(name,1) over(partition by team order by score_time) as lg1
		,lag(name,2) over(partition by team order by score_time) as lg2
from basketball_game_score_detail
) a
where      (a.name = a.ld1 and a.name = a.ld2) -- case1:比较当前记录与下两个记录
		or (a.name = a.ld1 and a.name = a.lg1) -- case2:比较当前记录与上一个记录和下一个记录 
		or (a.name = a.lg1 and a.name = a.lg2);-- case3:比较当前记录与上两个记录
-- where a.name =a.ld1 or a.name=a.lg1 ; 如果求相邻3个以下

2)比赛中帮助各自球队反超比分的球员姓名以及对应时间。

select   team
		,`number`
		,score_time
		,name
		,A_score_acum
		,B_score_acum
		,score_gap
		,last_score_gap
        ,score_gap * last_score_gap as product
from 
(		
	select   *
	        ,(A_score_acum - B_score_acum) as score_gap
	        ,lag(A_score_acum-B_score_acum,1)over(order by score_time) as last_score_gap
	from 		
	(	
	select  *
	       ,case when team='A' then score else 0 end as A_score
		   ,case when team='B' then score else 0 end as B_score
		   ,sum(case when team='A' then score else 0 end)over(order by score_time) as A_score_acum
		   ,sum(case when team='B' then score else 0 end)over(order by score_time) as B_score_acum
	from basketball_game_score_detail		
	) t1
)t2
where score_gap != 0  # 换成 (A_score_acum - B_score_acum) <> 0 亦可
      and score_gap * last_score_gap <= 0; # 必须要包含0


实验数据:

CREATE TABLE basketball_game_score_detail(
   team  VARCHAR(40) NOT NULL ,
   number VARCHAR(100) NOT NULL,
   score_time datetime NOT NULL,
   score int NOT NULL,
   name varchar(100)  NOT NULL
);
insert into  basketball_game_score_detail values('A',1,'2020/8/28 9:01:14',1,'A1');
insert into  basketball_game_score_detail values('A',5,'2020/8/28 9:02:28',1,'A5');
insert into  basketball_game_score_detail values('B',4,'2020/8/28 9:03:42',3,'B4');
insert into  basketball_game_score_detail values('A',4,'2020/8/28 9:04:55',3,'A4');
insert into  basketball_game_score_detail values('B',1,'2020/8/28 9:06:09',3,'B1');
insert into  basketball_game_score_detail values('A',3,'2020/8/28 9:07:23',3,'A3');
insert into  basketball_game_score_detail values('A',4,'2020/8/28 9:08:37',3,'A4');
insert into  basketball_game_score_detail values('B',1,'2020/8/28 9:09:51',2,'B1');
insert into  basketball_game_score_detail values('B',2,'2020/8/28 9:11:05',2,'B2');
insert into  basketball_game_score_detail values('B',4,'2020/8/28 9:12:18',1,'B4');
insert into  basketball_game_score_detail values('A',1,'2020/8/28 9:13:32',2,'A1');
insert into  basketball_game_score_detail values('A',1,'2020/8/28 9:14:46',1,'A1');
insert into  basketball_game_score_detail values('A',1,'2020/8/28 9:14:59',1,'A1');
insert into  basketball_game_score_detail values('A',4,'2020/8/28 9:16:00',1,'A4');
insert into  basketball_game_score_detail values('B',3,'2020/8/28 9:17:14',3,'B3');
insert into  basketball_game_score_detail values('B',2,'2020/8/28 9:18:28',3,'B2');
insert into  basketball_game_score_detail values('A',2,'2020/8/28 9:19:42',3,'A2');
insert into  basketball_game_score_detail values('A',1,'2020/8/28 9:20:55',1,'A1');
insert into  basketball_game_score_detail values('B',3,'2020/8/28 9:22:09',2,'B3');
insert into  basketball_game_score_detail values('B',3,'2020/8/28 9:23:23',3,'B3');
insert into  basketball_game_score_detail values('A',5,'2020/8/28 9:24:37',2,'A5');
insert into  basketball_game_score_detail values('B',1,'2020/8/28 9:25:51',3,'B1');
insert into  basketball_game_score_detail values('B',2,'2020/8/28 9:27:05',1,'B2');
insert into  basketball_game_score_detail values('A',3,'2020/8/28 9:28:18',1,'A3');
insert into  basketball_game_score_detail values('B',4,'2020/8/28 9:29:32',1,'B4');
insert into  basketball_game_score_detail values('A',1,'2020/8/28 9:30:46',3,'A1');
insert into  basketball_game_score_detail values('B',1,'2020/8/28 9:32:00',1,'B1');
insert into  basketball_game_score_detail values('A',4,'2020/8/28 9:33:14',2,'A4');
insert into  basketball_game_score_detail values('B',1,'2020/8/28 9:34:28',1,'B1');
insert into  basketball_game_score_detail values('B',5,'2020/8/28 9:35:42',2,'B5');
insert into  basketball_game_score_detail values('A',1,'2020/8/28 9:36:55',1,'A1');
insert into  basketball_game_score_detail values('B',1,'2020/8/28 9:38:09',3,'B1');
insert into  basketball_game_score_detail values('A',1,'2020/8/28 9:39:23',3,'A1');
insert into  basketball_game_score_detail values('B',2,'2020/8/28 9:40:37',3,'B2');
insert into  basketball_game_score_detail values('A',3,'2020/8/28 9:41:51',3,'A3');
insert into  basketball_game_score_detail values('A',1,'2020/8/28 9:43:05',2,'A1');
insert into  basketball_game_score_detail values('B',3,'2020/8/28 9:44:18',3,'B3');
insert into  basketball_game_score_detail values('A',5,'2020/8/28 9:45:32',2,'A5');
insert into  basketball_game_score_detail values('B',5,'2020/8/28 9:46:46',3,'B5');

https://mp.weixin.qq.com/s/PfOFMGJeomIfEMT2Atg6Xw(挑战完毕)


版权声明:本文为weixin_44976611原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。