题解 | 电竞赛事战队近期战绩查询
电竞赛事战队近期战绩查询
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定义输出逻辑
查看10道真题和解析