该表的每一行都表示学生的姓名和ID。
Id是一个连续的增量。
编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。
请注意,如果学生人数为奇数,则不需要更换最后一名学生的座位。
这是一道很新颖的题目,技术与场景结合的非常完美!
我就非常喜欢这种用技术巧妙解决实际业务的场景,能从中找到很大的成就感。
之前的大多数题目,都是将数据按一个方向相连接。极少出现像本题一样交叉连接的情况。
题目要求,交换两个相邻学生的座位,就像下图一样:
从图中可以看出,奇数ID的学生调整到ID+1的位置;偶数ID的学生,调整到ID-1的位置。这是ID不动,调整学生。
当然,从相对的角度上来说,也可以学生不动,调整ID。
也就是说,针对当前的每一个ID,计算出调整后的ID并返回。如果调整后的ID不存在,则使用原ID(不调整座位)。
因为计算调整后的ID逻辑比较复杂,而题目又要求使用调整后的ID进行排序,所以,参考SQL中,在排序时,使用了一种简易的写法“order by 1”。
也就是说,order by时,并没有指定具体的排序字段或排序表达式,而是指定了一个序号1。这里的1,表示使用select子句中的第一个列(表达式)进行排序。