一、题目
数据导入:
Create table If Not Exists Seat (id int, student varchar(255));
Truncate table Seat;
insert into Seat (id, student) values ('1', 'Abbot');
insert into Seat (id, student) values ('2', 'Doris');
insert into Seat (id, student) values ('3', 'Emerson');
insert into Seat (id, student) values ('4', 'Green');
insert into Seat (id, student) values ('5', 'Jeames');
表: 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 |
+----+---------+
解释:
请注意,如果学生人数为奇数,则不需要更换最后一名学生的座位。
二、解决
1、if / case when
思路:
主要根据 id 的奇偶性进行处理,这里要注意 id 最大值为基数的情况。
if id 为偶数,then id - 1;
if id为奇数且不为最大值, then id + 1;
if id为奇数且为最大值, then id 不变。
select
if (id%2=0, id-1,
if(id=mxid, id, id+1)
) as id, student
from seat, (select max(id) as mxid from seat) as init # 最大数为奇数
order by id;
2、row_number()
思路:
row_number() 作用实例:
SELECT
name, recovery_model_desc
FROM sys.databases
WHERE database_id < 5
ORDER BY name ASC;