SQL-leetcode—626. 换座位
626. 换座位
表: Seat
±------------±--------+
| Column Name | 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 升序 返回结果表。
- 条件1:交换每两个连续的学生的座位号 也就是id ,相当于一个+1、一个-1
- 条件2:如果学生的数量是奇数,则最后一个学生的id不交换,怎么判断最后一位学生且奇数?
- 按照id排序升序返回
方法一 if嵌套 + 子查询
select
-- 判断奇数和偶数,并做交换,在奇数处理时再加一个条件,判断最后一位是奇数不交换的情况即可。
if(id%2=0,id-1,if(id=(select count(1) from Seat),id,id+1)) as id
,student
from Seat order by id
方法二 row_number、rank()
-- if(id%2=0,id-2,id) 你细品
-- 我不交换,我把偶数统一减2,再排个序,是不是一样的效果,也不用考虑奇数末尾不移动了
select
rank() over(order by if(id%2=0,id-2,id)) as id
,student
from Seat order by id
-- row_number()
select
row_number() over(order by if(id%2=0,id-2,id)) as id
,student
from Seat order by id