leetcode 626. 换座位 [case / 奇偶数转换]

题目

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

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

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

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

示例:

idstudent
1Abbot
2Doris
3Emerson
4Green
5Jeames

假如数据输入的是上表,则输出结果如下:

idstudent
1Doris
2Abbot
3Green
4Emerson
5Jeames

注意

如果学生人数是奇数,则不需要改变最后一个同学的座位。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/exchange-seats
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路分析
方法1: case

     select查询出来每个记录的时候, 可以使用case判断当前记录的id值为奇数还是偶数, 如果为奇数则输出id+1, 如果为偶数则输出 id-1, 但是如果记录的数量为奇数, 则最后一条的id应该保持不变. 因此我们先查询出来记录的数量, 将其联结到表每个记录后面形成一个字段, 这样case可以使用这个字段判断id是否为最后一个记录.

select  (
	case MOD(id, 2) = 0 then id-1
	case MOD(id, 2) != 0 and id != cnt then id + 1 
	else id
 ), student 
from  seat 
join (select count(*) as cnt from seat) student_count;
order by id; 
方法2: (id + 1)^1 - 1

    使用上述公式, 如果id为偶数, 则其会转换为id - 1. 如果 id 为奇数, 则转换为 id + 1, 我们可以根据这个公式进行左联结, 在对有用字段select即可.

select
	s1.id, 
	(
	    case 
	    	when ISNULL(s2.student) 
	    	then s1.student 
	    	else s2.student
	) student
from 
	seat s1
left join
	seat s2
on (s1.id + 1)^1 - 1 = s2.id 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值