1、题目描述
表: Seat
±------------±--------+
| Column Name | Type |
±------------±--------+
| id | int |
| name | varchar |
±------------±--------+
Id是该表的主键列。
该表的每一行都表示学生的姓名和ID。
Id是一个连续的增量。
编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的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 |
±—±--------+
解释:
请注意,如果学生人数为奇数,则不需要更换最后一名学生的座位。
2、解题思路
还是老方法,先从提取要求,说是交换两个连续的学生座位号
而不是任意两个连续座位号,看输出内容实际交换是两个为一组进行的。
做这道,如果按照惯性思维是会先考虑调换student列内容,写起来会很复杂。
但是所谓调换student,相对的id列也是被调换的,那我们其实可以去调换id列去实现交换作为
select
(case
when id%2=1 and id in (select count(*) from Seat) then id
#当属于奇数列且是最后一个时不进行id调换
when id%2=1 then id+1
#属于奇数列时调换id
else id-1
#属于偶数的直接-1
end) as id ,student
from Seat order by id;