【Leetcode】高频SQL基础题--626.换座位
【Leetcode】高频SQL基础题–626.换座位
要求:编写解决方案来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。
按 id 升序 返回结果表。
解题思路: 交换student值
1、对 id 进行判断:如果是偶数,那就和上面的值进行交换;如果是奇数并且不是最后一个数,那就和下面的值进行交换;最后就剩下是奇数并且是最后一个数,就不进行交换操作;
2、对于上述思路可以用 CSAE语句+窗口函数 来实现;
3、最后根据 id 进行升序排序。
我看题解评论区有对 id 进行交换的思路,很妙:
CASE WHEN id%2=0 THEN id-1WHEN id%2=1 AND id<(SELECT max(id) FROM Seat) THEN id+1ELSE idEND
注意:
1、窗口函数:
LAG(num, 1) OVER (ORDER BY id)会按id排序后,返回当前行num列的前一个值。
LEAD(num, 1) OVER (ORDER BY id)会按id排序后,返回当前行num列的后一个值。
2、CASE语句:可以在 WHEN子句中使用多个条件进行组合判断,并且多个WHEN子句要是不满足才走ELSE
--例如:
CASE WHEN score > 90 THEN '优秀' WHEN score > 60 THEN '及格' --上面的条件不满足走这里ELSE '不及格'--要是上面都不满足,走这里
END
代码:
SELECTid,CASE WHEN id % 2 = 0 THEN LAG(student,1) OVER (ORDER BY id ASC)WHEN id % 2 = 1 and id != MAX(id)OVER() THEN LEAD(student,1) OVER (ORDER BY id ASC)ELSE student END AS student
FROM Seat
ORDER BY id ASC;