SqlBoy:异或、交换奇偶

发布于:2023-02-02 ⋅ 阅读:(288) ⋅ 点赞:(0)

公众号:SQL每日刷题—异或、交换奇偶

题目:

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

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

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

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

示例:

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

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

^表示的按位异或运算----异或运算的规则是,同位如果不同则为1,相同为0

比如2的二进制是10,1的二进制为01,2^1,得到二进制数11,即3,

同理3的二进制是11,1的二进制为01,3^1,得到二进制数10,即2,

所以4(100)-5(101),5(101)-4(100),依次类推。

因此从0开始的自然数与1进行按位异或运算能够得到相邻奇偶数的互换。

思路

1. ID为奇数时,ID+1 ; ID为偶数时,ID-1 ;ID最大为奇数时,不变
2. 将ID+1与1做异或,交换奇偶位置的数,再利用rank()函数排序

Sql逻辑

1、方式一

SELECT (CASE             WHEN MOD(id,2) = 1 AND id = (SELECT COUNT(*) FROM seat)   THEN id            WHEN MOD(id,2) = 1    THEN id+1            ElSE id-1        END) AS id, studentFROM seatORDER BY id;

2、方式二

select if(    (mod(id,2)=1 and id = (select max(id) from seat)),  id,  if(mod(id,2)=1,id+1,id-1)) as id,student from seat order by id

3、方式三

select rank() over(order by (id-1)^1) as id  ,student from seat
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到