leecode 数据库:626. 换座位

文章提供了解决如何使用SQL查询交换Seat表中每两个连续学生ID的方案。方法包括if/casewhen语句和row_number()函数,考虑了学生数量为奇数时最后一个学生座位不变的情况。给出的示例展示了如何根据ID的奇偶性调整学生顺序并按ID升序返回结果。
摘要由CSDN通过智能技术生成

一、题目

数据导入:

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值