刷题的时候遇到一个涉及limit 和 offset解题的。记录一下。
首先记录一下limit 和 offset 的用法
LIMIT语句用于限制从查询结果中返回的记录数。它可以用于分页查询,以限制每页显示的数据量。
下面直接引用文心一言的回答
LIMIT语句通常有两种形式:
LIMIT offset,count:在这种形式中,offset表示从查询结果中的第几行开始返回数据,count表示返回的记录数。
例如,SELECT * FROM table LIMIT 10, 5将返回从第11行开始的5条记录。offset可以是正整数或负整数。正整数表示从查询结果的起始位置开始返回数据,负整数表示从查询结果的末尾位置开始返回数据。
count必须是正整数,表示返回的记录数。
例如,SELECT * FROM table LIMIT 10, 5将返回查询结果中的第11至第15条记录。 LIMIT count:在这种形式中,count表示返回的记录数。
例如,SELECT * FROM table LIMIT 10将返回前10条记录。如果未指定offset,则默认从查询结果的起始位置开始返回数据。
自己重新组织一下语言。
LIMIT count可以分为以下两种情况:
- 接一个参数时,参数代表返回前多少条记录。
- 接两个参数时,第一个参数代表返回记录的起始位置,第二个参数代表返回多少条记录。
LIMIT offset :
LIMIT后面只能有一个参数,表示要取的的数量。
offset表示从查询结果中开始返回数据的位置。
例:limit 5 offset 2 表示从第3条记录开始取5条记录。
Employee 表:
±------------±-----+ | Column Name | Type |
±------------±-----+ | id | int | | salary | int |
±------------±-----+ 在 SQL 中,id 是这个表的主键。 表的每一行包含员工的工资信息。查询并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None) 。
查询结果如下例所示。
示例 1:
输入: Employee 表:
±—±-------+ | id | salary |
±—±-------+ | 1 | 100 | | 2 | 200 | | 3 | 300 |
±—±-------+ 输出:
±--------------------+ | SecondHighestSalary |
±--------------------+ | 200 |
±--------------------+ 示例 2:输入: Employee 表:
±—±-------+ | id | salary |
±—±-------+ | 1 | 100 |
±—±-------+ 输出:
±--------------------+ | SecondHighestSalary |
±--------------------+ | null |
±--------------------+
在知道 limit 和 offset 的用法之前,我第一反应是用窗口函数排序,然后取rank第二的值。
解法如下:
select (
select salary
from(
select
distinct salary,
dense_rank() over(order by salary desc) as salary_rank
from Employee
) as t #必须重命名
where salary_rank = 2 #取第二高的薪水
) as SecondHighestSalary #用临时表解决不存在第二高薪水的问题。
知道 limit 和 offset 的用法后
解决如下:
select (
select
distinct salary
from
Employee
order by salary desc
limit 1 offset 1
) as SecondHighestSalary
简单很多,不过在力扣上执行用时第二种比第一种慢,菜鸡还不知道原因。