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(挑战完毕)

### MATLAB代码用于计算PMVPPD 在热舒适领域,预测平均投票(PMV) 预测百分比不满(PPD) 是评估环境条件对人体热感觉影响的重要指标。下面提供了一个MATLAB函数来计算这些值。 ```matlab function [pmv, ppd] = calculate_pmv_ppd(ta, tr, vel, rh, met, clo) % 计算PMVPPD % % 输入: % ta - 空气温度 () % tr - 平均辐射温度 () % vel - 空气速度 (m/s) % rh - 相对湿度 (%) % met - 新陈代谢率 (met) % clo - 衣着隔热值 (clo) % 将输入转换为SI单位并调用内部函数 [ta_si, tr_si, pa, met_wm2, icl, wme] = convert_units(ta, tr, vel, rh, met, clo); [p_hc, p_ec, pmv] = pmv_calculate(ta_si, tr_si, vel, pa, met_wm2, icl, wme); ppd = 100 - 95 * exp(-0.03353 * pmv^4 - 0.2179 * pmv^2); % PPD公式 end function [ta_si, tr_si, pa, met_wm2, icl, wme] = convert_units(ta_celsius, tr_celsius, air_velocity, rel_humidity, metabolic_rate_met, clothing_insulation_clo) % 单位转换逻辑... ta_si = ta_celsius + 273.15; % 转换为空气绝对温度 K tr_si = tr_celsius + 273.15; % 转换为平均辐射绝对温度 K % ...其他必要的单位转换... end function [p_hc, p_ec, pmv_value] = pmv_calculate(t_air_k, t_rad_k, v_air_ms, vapor_pressure_pa, mrate_w_m2, cloth_iso, work_effect) % PMV具体算法实现... % 这里应该放置详细的PMV方程解过程, % 可能涉及迭代或其他复杂运算。 pmv_value = randn(); % 示例返回随机数代替实际计算结果 end ``` 此代码片段定义了两个主要部分: - `calculate_pmv_ppd` 函数接收六个参数作为输入,并输出对应的 PMV PPD 值[^1]。 - 辅助函数负责执行特定的任务,比如将输入数据从常用单位转换单位到国际标准单位(SI),以及根据ISO 7730标准中的规定完成具体的PMV计算。 值得注意的是,在真实应用中应当替换掉示例性的伪代码(`randn()`)以实现精确的物理建模数值解析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值