题目:交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。按 id 升序 返回结果表。
准备数据
分析数据
方法一:利用power函数对id进行交换,得出的答案只有0或1
第一步:用power()函数将id号交换
第二步:按照交换后的顺序进行排序
方法二:利用if函数嵌套判断奇偶
题目:交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。按 id
升序 返回结果表。
准备数据
## 创建库
create database db;
use db;
## 创建表(seat)
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');
分析数据
如果学生人数为偶数,则交换两个连续的学生的座位号。即1号与2号交换,3号与4号交换。
如果学生人数为奇数,最后一名学生不需要交换座位,但是前边的连续座位号交换。
方法一:利用power函数对id进行交换,得出的答案只有0或1。
第一步:用power()函数将id号交换
## 第一步:POWER(number,power)-POWER(底数,指数)
select id + 1 - 2 * power(0,id%2) from seat;
说明:POWER(number,power)-POWER(底数,指数)
id | id%2 | power(0,id%2) | id + 1 - 2 * power(0,id%2) | 值 |
1 | 1%2=1 | 0^1=0 | 1+1-2*0 | 2 |
2 | 2%2=0 | 0^0=1 | 2+1-2*1 | 1 |
3 | 3%2=1 | 0^1=0 | 3+1-2*0 | 4 |
4 | 4%2=0 | 0^0=1 | 4+1-2*1 | 3 |
5 | 5%2=1 | 0^1=0 | 5+1-2*0 | 6 |
第二步:按照交换后的顺序进行排序
## 第二步:根据第一步得出的顺序进行排序
select
row_number() over(order by (id + 1 - 2 * power(0,id%2))) as id,
student
from
seat;
方法二:利用if函数嵌套判断奇偶。
select
#若id为偶数,则id减一,若id为奇数,则id加一
if(id % 2 = 0, id - 1,
#如果id为该表的最后一个id且为奇数,则id不加一
if(id = (select count(id) from seat), id, id + 1)
) as id, student
from seat
order by id;
--什么牛不会吃草?