# 找到求职方向为算法工程师,且注册当天就完成了算法类试卷的人, UID
# 按参加过的所有考试最高得分排名  根据这些人的最高得分排序
# 取出第三页,也就是7-9条记录

SELECT uid, level, register_time, max_score
FROM (
	# 查询必要的字段,还有每个用户的历史最高的得分
    SELECT uid, level, b.register_time,job,submit_time,tag, MAX(score) OVER(PARTITION BY uid) max_score
    FROM exam_record a
    JOIN user_info b USING(uid)
    JOIN examination_info c USING(exam_id)
    ) f
# 在外层,筛选出符合条件的用户
WHERE job = '算法' AND DATE(submit_time) = DATE(register_time) AND tag = '算法'
ORDER BY max_score DESC
# 取指定范围的记录
LIMIT 3 OFFSET 6

根据题意是要求历史最高得分,但是之前把where放在子查询里也通过了。

现在放在外查询,保证了是历史最高

新知识点:

LIMITOFFSET是在SQL查询中用于指定返回结果集的行数范围的关键字。它们通常用于实现分页功能,即在大量数据中每次仅检索并显示一部分数据。让我详细解释一下这两个关键字:

  1. LIMIT: 这个关键字用于限制SQL查询返回的行数。例如,LIMIT 10意味着查询将返回最多10行数据。
  2. OFFSET: 这个关键字用于指定在开始返回行之前要跳过的行数。例如,OFFSET 5意味着从结果集的第六行开始返回数据(因为行的计数是从0开始的)。

LIMITOFFSET一起使用时,它们定义了返回结果集的一部分。例如,LIMIT 5 OFFSET 10意味着跳过前10行,然后返回接下来的5行。

在某些SQL方言中(如MySQL),LIMITOFFSET可以结合为一个简短的语法,例如LIMIT 10, 5。这与LIMIT 5 OFFSET 10是等价的。首先指定的是要跳过的行数,其次是要返回的行数。

  • LIMIT 3 OFFSET 6: 跳过前6行,然后返回接下来的3行。
  • LIMIT 6, 3: 这是另一种语法,用于同样的操作:跳过前6行,然后返回接下来的3行。

使用哪种语法取决于您使用的SQL数据库系统。不同的系统可能有不同的语法规则,所以最好查阅特定数据库的文档以确认正确的用法。