题干:
小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。
其中纵列的 id 是连续递增的
小美想改变相邻俩学生的座位。
你能不能帮她写一个 SQL query 来输出小美想要的结果呢?
示例:
id | student |
---|---|
1 | Abbot |
2 | Doris |
3 | Emerson |
4 | Green |
5 | Jeames |
假如数据输入的是上表,则输出结果如下:
id | student |
---|---|
1 | Doris |
2 | Abbot |
3 | Green |
4 | Emerson |
5 | Jeames |
注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。
分析:
这个可以直接用select ,case结合进行数据的移位,也可以利用位操作进行移位,两者的时间相差不多。
第一种:用select和case(235ms)
select (case when mod(id,2)!=0 and counts!=id then id+1
when mod(id,2)!=0 and counts=id then id
else id-1 END
)as id,student from seat,(select count(*) as counts from seat) as seat_counts
order by id asc;
第二种:位操作(251ms)
SELECT
s1.id, COALESCE(s2.student, s1.student) AS student
FROM
seat s1
LEFT JOIN
seat s2 ON ((s1.id + 1) ^ 1) - 1 = s2.id
ORDER BY s1.id;