题解 | 电竞赛事战队近期战绩查询

电竞赛事战队近期战绩查询

https://www.nowcoder.com/practice/7dda27e223a94184a3269ed99ac42fbe

# 输出列:team_name(表1原字段),region(表1原字段),

match_date(表2原字段),opponent(表2原字段),kills(表2原字段),deaths(表2原字段),

kda_ratio=kills/deaths(由表2构建计算公式),result(由表2is_win字段改造,赋值1为胜,0为负 CASE WHEN)

# 数据源:两张表,连接键team_id,内联结

# 分组/窗口:排序选窗口,ROW_NUMBER()OVER(partition by e.time_id order by match_date DESC match_id) AS rk

# 过滤条件:match_date 最近三场,窗口函数取rk<=3

# 排序与限制:Order by team_id,match_date DESC,match_id;LIMIT-不涉及

# 边界与异常:NULL值-内联结舍掉了;除0-本来需考虑kda_ratio分母,但因为题目deaths保证>=1,所以没关系;重复值-不涉及;四舍五入ROUND(kda_ratio,2)

SELECT team_name,region,match_date,opponent,kills,deaths,

    kda_ratio,result

FROM (

    SELECT e.team_id,match_id, -- 用于外层排序使用

    team_name,region,match_date,opponent,kills,deaths,

    ROUND(kills*1.0/deaths,2) AS kda_ratio, -- 整数相除,用*1.0防止截断

    (CASE WHEN is_win=1 THEN '胜' ELSE '负' END) AS result,

    ROW_NUMBER()OVER(partition by e.team_id order by match_date DESC,match_id) AS rk -- 需要排名,但不结果不显示排名,套子查询/CTE

    FROM esports_teams AS e INNER JOIN match_records AS m

    ON e.team_id=m.team_id

) AS r

WHERE rk<=3  -- 窗口函数在WHERE后执行,所以不能放子查询里

ORDER BY r.team_id,match_date DESC,match_id -- 窗口函数定义排名逻辑,ORDER定义输出逻辑

全部评论

相关推荐

02-26 09:15
已编辑
蚌埠学院 golang
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务