赛题 1
1.DMS 截图:

2.SQL 源码:
SELECT t.name AS test_name, s.name AS student_name, ta.score AS highest_score FROM test t JOIN ( SELECT testid, MAX(score) AS max_score FROM testattempt GROUP BY testid ) AS ma ON t.id = ma.testid JOIN testattempt ta ON ta.testid = ma.testid AND ta.score = ma.max_score JOIN student s ON s.id = ta.studentid ORDER BY t.name, highest_score DESC;
3.解题思路:首先,要从三个表中检索数据,因此需要使用JOIN。可以使用子查询来找到每个考试中的最高分数。在子查询中,使用GROUP BY操作来按考试分组,并使用MAX函数找到每个考试的最高分。然后,将这个子查询的结果与testattempt表连接,找到与最高分数匹配的结果。接下来,将结果与student表连接,以获取学生的姓名。最后,按照考试名称和分数降序排序,得到每门考试分数从高到低的顺序。
赛题 2
1.DMS 截图:
2.SQL 源码:
SELECT COUNT(*) / (SELECT COUNT(DISTINCT player_id) FROM activity) AS ratio FROM activity
WHERE DATEDIFF(event_date, (SELECT MIN(event_date) FROM activity)) BETWEEN 0 AND 7;
3.解题思路:
首先,我们需要找到在首次游玩后的一周内至少再有一次游玩的玩家。为了达到这个目的,我们需要在活动表中筛选出满足这个条件的玩家,并计算他们的比例。我们使用一个子查询来获取活动表中第一个游戏的日期。在子查询中,我们使用了MIN函数来找到每个玩家第一次游玩的日期。接着,在外部查询中,我们使用了DATEDIFF函数来计算每个玩家第一次游玩和当前日期之间的天数差。这个天数差必须在0到7之间,以确保玩家在首次游玩后的一周内至少再有一次游玩。然后,我们使用了COUNT函数来计算满足这个条件的玩家数量。接着,我们将这个数量除以总玩家数量,得到满足条件的玩家比例。最后,我们将这个比例四舍五入到小数点后两位,得到最终结果。
赛题 3
1.DMS 截图:

2.SQL 源码:
SELECT triangle.id, ROUND(0.5 * SQRT(abs((point1.x - point2.x))^2 + abs((point1.y - point2.y))^2 + abs((point1.z - point2.z))^2) + 0.5 * SQRT(abs((point2.x - point3.x))^2 + abs((point2.y - point3.y))^2 + abs((point2.z - point3.z))^2) + 0.5 * SQRT(abs((point3.x - point1.x))^2 + abs((point3.y - point1.y))^2 + abs((point3.z - point1.z))^2), 2) AS area FROM triangle
JOIN point AS point1 ON triangle.pointId1 = point1.id
JOIN point AS point2 ON triangle.pointId2 = point2.id
JOIN point AS point3 ON triangle.pointId3 = point3.id;
3.解题思路:
使用了ROUND函数来将计算结果舍入到两位小数。此外,还使用了SQRT函数来计算平方根,从而计算三角形的边长。最后,使用了ABS函数来计算绝对值,以确保所有数值都为正数。
该SQL语句通过JOIN操作连接Triangle表和Point表,以获取每个三角形的三个顶点信息。在计算面积时,该语句使用了每个顶点对之间的距离平方,并将它们相加。





