【sql】leetcode626. 换座位

小美是一所中学的信息科技老师,她有一张 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  |
+---------+---------+

一、改变id

select 
	(case when mod(s.id,2)=1 and c.cou>s.id then s.id+1
	when mod(s.id,2)=0 then s.id-1
	else s.id end) as id,s.student
from seat as s, (select count(*) as cou from seat) as c
order by id

二、coalesce()函数 coalesce()函数:返回表达式中第一个非空表达式 位运算((s1.id + 1) ^ 1) - 1 :奇数- >奇数+1,偶数->偶数-1

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;

三、lead()函数和lag()函数 lead()函数:取当前顺序的下N行记录 lag()函数:取当前顺序的上N行记录 decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)

select id,
decode(mod(id,2), 1, lead(student, 1, student) over(order by id), lag(student, 1) over(order by id)) as student
from seat
经验分享 程序员 微信小程序 职场和发展