面试题--【SQL篇】--换座位

📅 发布时间:2026/7/17 10:12:19 👁️ 浏览次数:
面试题--【SQL篇】--换座位
今天一个朋友发来这样一道题。这是他面试时的其中一道是当时考虑了很久也没完成最后不得不放弃。那我们就来看一下题目描述如下必须要求用sql完成表: Seat----------------------|ColumnName|Type|----------------------|id|int||student|varchar|----------------------id 是该表的主键唯一值列。该表的每一行都表示学生的姓名和 ID。ID 序列始终从 1 开始并连续增加。编写解决方案来交换每两个连续的学生的座位号。如果学生的数量是奇数则最后一个学生的id不交换。按 id 升序 返回结果表。查询结果格式如下所示。示例 1:输入: Seat 表:-------------|id|student|-------------|1|Abbot||2|Doris||3|Emerson||4|Green||5|Jeames|-------------输出:-------------|id|student|-------------|1|Doris||2|Abbot||3|Green||4|Emerson||5|Jeames|-------------解释: 请注意如果学生人数为奇数则不需要更换最后一名学生的座位。看到这个题当时的思路是根据 ID 的奇偶性调整学生对应的 ID奇数 ID 与下一个偶数 ID 交换最后一个奇数 ID 保持不变且结果按 ID 升序返回。核心思路1、判断 ID 奇偶性偶数 ID交换后对应 ID-1奇数 ID若不是最后一个 ID交换后对应 ID1若是最后一个 ID保持不变。2、关联原表通过调整后的 ID 关联原表获取交换后的学生姓名最终按原 ID 升序返回。完整 SQL 实现SELECTt.id,-- 根据调整后的 target_id 匹配原表的学生姓名(SELECTs.studentFROMSeat sWHEREs.idt.target_id)ASstudentFROM(-- 第一步生成每个 ID 对应的目标交换 IDSELECTid,CASE-- 偶数 ID交换到前一个 IDWHENMOD(id,2)0THENid-1-- 奇数 ID如果是最后一个 ID 则不变否则交换到后一个 IDWHENid(SELECTMAX(id)FROMSeat)THENidELSEid1ENDAStarget_idFROMSeat)t-- 按原 ID 升序返回ORDERBYt.id;后来我也上网查了下发现了一个更牛逼的思路分享给大家他的思路是将偶数 id 减 2 后重排即可核心代码如下MYSQL:select rank() over(order by if(id % 2 0,id-2,id)) as id ,student from seat这思路确实惊为天人不知道你看到有更好的思路欢迎分享