自学内容网 自学内容网

SQL-leetcode—626. 换座位

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,再排个序,是不是一样的效果,也不用考虑奇数末尾不移动了
select
    rank() over(order by if(id%2=0,id-2,id)) as id
    ,student
from Seat order by id 

-- row_number()
select
    row_number() over(order by if(id%2=0,id-2,id)) as id
    ,student
from Seat order by id 

原文地址:https://blog.csdn.net/MrZhangBaby/article/details/145177918

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!