626. 换座位
Question
表:
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 |
+----+---------+
**解释:
**请注意,如果学生人数为奇数,则不需要更换最后一名学生的座位。
Answer
WITH temporaryTable(total) AS (
SELECT COUNT(id)
FROM Seat
)
SELECT
(case
when mod(id,2)!=0 AND id=total then id
when mod(id,2)!=0 AND id!= total then id+1
else id-1
end) as 'id',
student
FROM
Seat, temporaryTable
ORDER BY id
使用
with
先计算出最后一个座位的id用于后续判断
通过
mod(,2)
找余数来确定是否是双数
通过
case when
来依据不同的情况对id做出改变
当
mod(id,2)!=0 AND id!=total
是基数且不是最大值:
id + 1
=> 1->2 3->4…
当
mod(id,2)!=0 AND id=total
是基数且是最大值:
id
当
mod(id,2)=0
为偶数:
id - 1
=> 2->1 4->3…
版权归原作者 studying_mmr 所有, 如有侵权,请联系我们删除。