【LeetCode】626.换座位-学习笔记-对行数的转换

小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id

其中纵列的id是连续递增的

小美想改变相邻俩学生的座位。

你能不能帮她写一个 SQL query 来输出小美想要的结果呢?

【LeetCode】626.换座位-学习笔记-对行数的转换_第1张图片


答案:

方法一:按题目的要求,对所有数据进行拆分,12互换,34互换,最后一个是奇数的不动,然后就分成三块来写,第一块就是id为偶数的,id-1就相当于和奇数的互换了,第二块是id为奇数的,id+1就相当于和偶数的互换了,最后一块是最后一个为奇数的,不换,然后三块合并排序就出来结果了。

[sql]  view plain  copy
  1. select s.id , s.student from  
  2. (  
  3. select id-1 as id ,student from seat where mod(id,2)=0  
  4. union  
  5. select id+1 as id,student from seat where mod(id,2)=1 and id !=(select count(*) from seat)  
  6. union  
  7. select id,student from seat where mod(id,2)=1 and id = (select count(*) from seat)  
  8. ) s order by id;  

方法二:此种方法是上面一种方法的一个拓展简化,思路差不多,也有区别

对照上表及其查询结果可以得知,当原id为奇数时,交换座位后的id变为id+1,当原id为偶数时,交换座位后的id变为id-1,另一个方面需要考虑的是,学生人数为奇数时,最后一个学生的id不变,故应当用子查询确定学生的人数,然后分情况讨论即可。

[sql]  view plain  copy
  1. select (case  
  2.       when mod(id,2)!=0 and id!=counts then id+1  
  3.       when mod(id,2)!=0 and id=counts then id  
  4.       else id-1 end)as id,student  
  5.       from seat,(select count(*)as counts from seat)as seat_counts  
  6.                 order by id;  


因为题目写了,id是连续递增的,所以,学生换位,可以转换成id数值的变换。

一行与二行换,三行与四行换,五行为最后一行,则不换。

所以 id-1 and mod(id,2)=0   这就是对于奇数行 位置的 定义 (如果有下一行,则与下一行换位);

同样 id+1 and mod(id,2)=1  这就是对于偶数行 位置的 定义 (与上一行的奇数行换位)

而    mod(id,2)=1 and id = (select count(*) from seat) ,这就是当id数与行数相等的时候(即最后一行)时,id保持不变。

最后通过order by id 排序即可。



你可能感兴趣的:(sql学习)