leet code sql 626
문제
- 두 id가 연속되어 있는 경우에, 위치를 바꾸어서 출력
- 다만, 마지막 혼자 남는 경우에는 그대로 이름을 나둔다.
문제 접근
- lead, lag 함수를 활용하여 현재 값을 기준으로 위 아래 값을 가져온다.
- 홀수인 경우에는 본인 이후 값을, 짝수인 경우에는 본인 이전 값을 가져온다.
- if 함수를 활용하여 경우의 수 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
with seat_info as (
select
id,
student,
lead(student, 1) over() lead_student,
lag(student, 1) over() lag_student
from Seat a
)
select
id,
if(id%2=0, lag_student, if(id = (select max(id) from Seat), student, lead_student)) student
from seat_info
order by id;
- 한발짝 더 나아가 생각해본다면, 현재 학생의 id를 새롭게 갱신하여 주면 된다.
- 두 개의 속도 차이는 별도로 나지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
with cte as (
select
*,
lead(id) over(order by id) as next,
lag(id) over(order by id) as prev
from seat
)
select case
when((id%2 =1) and next is not null) then next
when (id%2 = 0) then prev
else id
end as id,
student
from cte
order by id;