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,再排個序,是不是一樣的效果,也不用考慮奇數末尾不移動了
selectrank() over(order by if(id%2=0,id-2,id)) as id,student
from Seat order by id -- row_number()
selectrow_number() over(order by if(id%2=0,id-2,id)) as id,student
from Seat order by id