sql - 计算所有玩家权重的方差
问题描述
我们从 nba 获得数据,其中每个表的描述如下:
coaches_season,每个元组描述一位教练在一个赛季的表现;[cid, year, yr_order, year, season_win, season_loss, play_off_win, play_off_loss, tid]
团队,每个元组给出一个团队的基本信息;[tid,位置,名称,联赛]
玩家,每个元组给出一个玩家的基本信息;[ilkid,名字,姓氏,位置,first_season,last_season,h_feet,h_inches,体重,大学,生日]
player_rs,每个元组给出了一名球员在一个常规赛中的详细表现;[ilkid,tid,pts,asts,of,ftm,tpa,tpm,fgm,fga,fta,blk,营业额,stl,dreb,oreb,reb,分钟,gp,联赛,姓氏,名字,年份]
player_rs_career,每个元组都给出了一名球员在其职业生涯中的详细常规赛表现;[ilkid, firstname, lastname, fga, fgm, fta, ftm, tpa, tpm, pf, stl, oreb, minutes, gp, dreb , asts, 失误, blk, reb, 联赛]
选秀,每个元组显示NBA选秀的信息。[draft_year, firstname, lastname, draft_round, tid, selection, draft_from, ilkid, 联赛]
我发现了很多查询,但被这 3 个查询卡住了:
I) 对于每所大学,打印大学名称和他们发送给 NBA 的平均选秀数(每个赛季)。但是,只报告那些在至少 3 个赛季中发送选秀的大学。
II) 计算所有玩家权重的方差;
III) 打印职业生涯得分超过 12000 分或效力超过 12 个赛季的人的姓名。
解决方案
在这种情况下,尤其是每个表的 DDL,包括主键和外键定义。还包括样本数据,作为文本,而不是图像和该数据的预期输出。此外,在这种情况下,您可能希望包含列名的定义,因为并非每个人都熟悉 NBA 使用的首字母缩略词。
话虽如此,我会给它一个刺。请注意,由于您没有包含测试数据或表定义,因此尚未测试查询。
-- I) For each college, print the college name and average number of drafts (per season) they sent to NBA.
-- However, only report those colleges that sent drafts in at least 3 seasons.
-- assumptions:
-- draft yr integer specifying calendar year of draft
-- draft_from text name of college
-- average number of drafts (per season) ?? how many drafts are there per season
-- what is the difference between season and year
with draft as
(select max(draft_yr) dy from draft_year)
, dy_last3 as
(select distinct draft_from df
from draft_year
where exists (select null from draft_year, draft where draft_yr = dy)
and exists (select null from draft_year, draft where draft_yr = dy-1)
and exists (select null from draft_year, draft where draft_yr = dy-2)
)
select draft_from, round(avg(drc),2) adv_drafts
from (
select draft_from, draft_yr, count(*) drc
from draft_year
where draft_from in (select df from dy_last3)
group by draft_from,draft_yr
) t
group by draft_from;
-- II) Calculate the variance of the weights of all players;
-- assumption: weight defined as float;
select var_samp(weight) from player;
OR
select var_pop(weight) from player;
-- III)Print the first and last names of those who either scored more than 12000 points in their careers or played for more than 12 seasons.
-- assumption fgm => field goals made = 2 points each
-- ftm => free throws made = 1 point each
-- tpm => 3 point shot make = 3 points each
-- ilkid => Pk in player and FK in player_rs_career
-- table player_rs_career does include last/current season
-- note player_rs_career does NOT contain year/season, unless hidden by undescribed column name
select distinct *
from (select p.firstname, p.lastname
, sum(ftm + (2*fgm) + (3*tpm)) over (partition by p.ilkid) points
, (coalesce (p.last_season, extract (year from now())::integer) - p.first_season + 1) seasons
from player p
join player_rs_career pc
on p.ilkid = pc.ilkid
) pp
where points > 12000
or seasons > 12;